<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Jonathan's Page on jneidel</title><link>https://jneidel.com/</link><description>Recent content in Jonathan's Page on jneidel</description><generator>Hugo</generator><language>en</language><managingEditor>web@jneidel.com (Jonathan Neidel)</managingEditor><webMaster>web@jneidel.com (Jonathan Neidel)</webMaster><copyright>[&amp;copy; Jonathan Neidel. All rights reserved.](copyright)</copyright><atom:link href="https://jneidel.com/rss.xml" rel="self" type="application/rss+xml"/><item><title>Building a Split Keyboard for myself</title><link>https://jneidel.com/project/split-keyboard/</link><pubDate>Sun, 22 Feb 2026 00:00:00 +0000</pubDate><author>web@jneidel.com (Jonathan Neidel)</author><guid>https://jneidel.com/project/split-keyboard/</guid><description>&lt;p&gt;I have only ever used a laptop.
To sit with a laptop at a desk is to sit hunched over.
Fine for a time, but ideally you&amp;rsquo;d want to sit up, with your back straight and
look straight ahead.&lt;/p&gt;
&lt;p&gt;This is a solved problem.
Get a monitor or laptop stand and an external mouse and keyboard.&lt;/p&gt;

 
 
 
 
 
 
 

 
 
 

 
 

 
 
 &lt;figure class="md:w-11/12 mx-auto my-0 rounded-sm"&gt;
 
 
 









 
 &lt;picture
 class="md:w-11/12 mx-auto my-0 rounded-sm"
 
 &gt;
 
 
 

 
 &lt;source
 
 srcset="https://jneidel.com/project/split-keyboard/monitor-laptop-stand_hu_e75376016faa2961.webp 330w,/project/split-keyboard/monitor-laptop-stand_hu_56c3f37e0aa86e42.webp 660w
 
 ,/project/split-keyboard/monitor-laptop-stand_hu_9df3f265fa708dd3.webp 1024w
 
 
 ,/project/split-keyboard/monitor-laptop-stand_hu_5371b21364d5b3be.webp 1320w
 "
 
 sizes="100vw"
 type="image/webp"
 /&gt;
 
 &lt;img
 width="2400"
 height="1350"
 class="md:w-11/12 mx-auto my-0 rounded-sm"
 alt="A monitor next to a laptop stand."
 loading="lazy" decoding="async"
 
 
 src="https://jneidel.com/project/split-keyboard/monitor-laptop-stand_hu_41cdfce5883fe9cc.jpg"
 srcset="https://jneidel.com/project/split-keyboard/monitor-laptop-stand_hu_dae7e3f2cd92ce52.jpg 330w,/project/split-keyboard/monitor-laptop-stand_hu_41cdfce5883fe9cc.jpg 660w
 
 ,/project/split-keyboard/monitor-laptop-stand_hu_8d4b60a2156b2309.jpg 1024w
 
 
 ,/project/split-keyboard/monitor-laptop-stand_hu_7921ffce4af9141e.jpg 1320w
 "
 sizes="100vw"
 
 /&gt;
 &lt;/picture&gt;
 


 &lt;figcaption class="text-center"&gt;&lt;span class="figure-number"&gt;Figure 1: &lt;/span&gt;A monitor and a &lt;a href="https://nexstand.eu" rel="external"&gt;laptop stand&lt;/a&gt;.&lt;/figcaption&gt;
 &lt;/figure&gt;


&lt;p&gt;As you see I already had the monitor setup, but not the keyboard.
Since I would use this keyboard all the time, it better be a great one.
I chose my laptop, a Thinkpad, for that exact reason: it probably has the best
laptop keyboard around.
For my external keyboard I also wanted one of the best around.&lt;/p&gt;
&lt;p&gt;This article tells the story of how I built an ergonomic split keyboard
for myself.
How I configured it and got good enough with it to be able to actually use it on
a daily basis.&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s start with what makes a great external keyboard.&lt;/p&gt;
&lt;h2 id="what-is-the-best-external-keyboard" class="relative group"&gt;Great keyboard design &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#what-is-the-best-external-keyboard" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;Classic keyboards layouts emulate the typewriter through a sideways stagger that
misaligns the keys.
This stagger was necessary in typewriters their metal hammers would not get stuck.
A constraint modern computers don&amp;rsquo;t share. 🙂&lt;/p&gt;

 
 
 
 
 
 
 

 
 
 

 
 

 
 
 &lt;figure class="md:w-10/12 mx-auto my-0 rounded-sm"&gt;
 
 
 









 
 &lt;picture
 class="md:w-10/12 mx-auto my-0 rounded-sm"
 
 &gt;
 
 
 

 
 &lt;source
 
 srcset="https://jneidel.com/project/split-keyboard/design-row-staggered_hu_bc0cbe40518322da.webp 330w,/project/split-keyboard/design-row-staggered_hu_a4b65c2cd4080220.webp 660w
 
 
 ,/project/split-keyboard/design-row-staggered_hu_dcf5edcfc97ec621.webp 793w
 
 
 
 
 ,/project/split-keyboard/design-row-staggered_hu_dcf5edcfc97ec621.webp 793w
 
 "
 
 sizes="100vw"
 type="image/webp"
 /&gt;
 
 &lt;img
 width="793"
 height="349"
 class="md:w-10/12 mx-auto my-0 rounded-sm"
 alt="The row staggered keyboad design"
 loading="lazy" decoding="async"
 
 
 src="https://jneidel.com/project/split-keyboard/design-row-staggered_hu_b448e4b0fd64f43b.png"
 srcset="https://jneidel.com/project/split-keyboard/design-row-staggered_hu_ccee90e8f1f06c43.png 330w,/project/split-keyboard/design-row-staggered_hu_b448e4b0fd64f43b.png 660w
 
 ,/project/split-keyboard/design-row-staggered.png 793w
 
 
 ,/project/split-keyboard/design-row-staggered.png 793w
 "
 sizes="100vw"
 
 /&gt;
 &lt;/picture&gt;
 


 &lt;figcaption class="text-center"&gt;&lt;span class="figure-number"&gt;Figure 2: &lt;/span&gt;A classic keyboard layout with a sideway stagger.&lt;/figcaption&gt;
 &lt;/figure&gt;


&lt;p&gt;With the removal of the stagger most finger movement become vertical rather than
diagonal, finger paths are more consistent and strain is reduced.&lt;/p&gt;

 
 
 
 
 
 
 

 
 
 

 
 

 
 
 &lt;figure class="md:w-10/12 mx-auto my-0 rounded-sm"&gt;
 
 
 









 
 &lt;picture
 class="md:w-10/12 mx-auto my-0 rounded-sm"
 
 &gt;
 
 
 

 
 &lt;source
 
 srcset="https://jneidel.com/project/split-keyboard/design-ortho_hu_83c74bc0aebdcf2f.webp 330w,/project/split-keyboard/design-ortho_hu_6bd2a75f62e80a64.webp 660w
 
 
 ,/project/split-keyboard/design-ortho_hu_1174c71013690016.webp 774w
 
 
 
 
 ,/project/split-keyboard/design-ortho_hu_1174c71013690016.webp 774w
 
 "
 
 sizes="100vw"
 type="image/webp"
 /&gt;
 
 &lt;img
 width="774"
 height="344"
 class="md:w-10/12 mx-auto my-0 rounded-sm"
 alt="The ortholinear keyboad design"
 loading="lazy" decoding="async"
 
 
 src="https://jneidel.com/project/split-keyboard/design-ortho_hu_d2a910aefc8e9446.png"
 srcset="https://jneidel.com/project/split-keyboard/design-ortho_hu_dc5931b022fa96ff.png 330w,/project/split-keyboard/design-ortho_hu_d2a910aefc8e9446.png 660w
 
 ,/project/split-keyboard/design-ortho.png 774w
 
 
 ,/project/split-keyboard/design-ortho.png 774w
 "
 sizes="100vw"
 
 /&gt;
 &lt;/picture&gt;
 


 &lt;figcaption class="text-center"&gt;&lt;span class="figure-number"&gt;Figure 3: &lt;/span&gt;After the removal of the sideway stagger.&lt;/figcaption&gt;
 &lt;/figure&gt;


&lt;p&gt;To have the keyboard as one glued-together brick means that your arms are not
aligned with your shoulders, but point inward.&lt;/p&gt;

 
 
 
 
 
 
 

 
 
 

 
 

 
 
 &lt;figure class="md:w-10/12 mx-auto my-0 rounded-sm"&gt;
 
 
 









 
 &lt;picture
 class="md:w-10/12 mx-auto my-0 rounded-sm"
 
 &gt;
 
 
 

 
 &lt;source
 
 srcset="https://jneidel.com/project/split-keyboard/design-split_hu_a3c117ed627352f7.webp 330w,/project/split-keyboard/design-split_hu_dfb8c8bbb586b1cb.webp 660w
 
 
 ,/project/split-keyboard/design-split_hu_30ac8fdb7580f72f.webp 787w
 
 
 
 
 ,/project/split-keyboard/design-split_hu_30ac8fdb7580f72f.webp 787w
 
 "
 
 sizes="100vw"
 type="image/webp"
 /&gt;
 
 &lt;img
 width="787"
 height="333"
 class="md:w-10/12 mx-auto my-0 rounded-sm"
 alt="The split ortholinear keyboad design"
 loading="lazy" decoding="async"
 
 
 src="https://jneidel.com/project/split-keyboard/design-split_hu_8d9192af4190d89e.png"
 srcset="https://jneidel.com/project/split-keyboard/design-split_hu_12a48b0e17af2e8d.png 330w,/project/split-keyboard/design-split_hu_8d9192af4190d89e.png 660w
 
 ,/project/split-keyboard/design-split.png 787w
 
 
 ,/project/split-keyboard/design-split.png 787w
 "
 sizes="100vw"
 
 /&gt;
 &lt;/picture&gt;
 


 &lt;figcaption class="text-center"&gt;&lt;span class="figure-number"&gt;Figure 4: &lt;/span&gt;With the layout split in two.&lt;/figcaption&gt;
 &lt;/figure&gt;


&lt;p&gt;The ideal hand position is also not flat on the desk, but inclined to the side.
Split keyboards make it possible to incline both hands independently of each
other and in opposing directions, which is not possible if the keyboard is one large brick.&lt;/p&gt;

 
 
 
 
 
 
 

 
 
 

 
 

 
 
 &lt;figure class="md:w-11/12 mx-auto my-0 rounded-sm"&gt;
 
 
 









 
 &lt;picture
 class="md:w-11/12 mx-auto my-0 rounded-sm"
 
 &gt;
 
 
 

 
 &lt;source
 
 srcset="https://jneidel.com/project/split-keyboard/tented-keyboard-with-hands_hu_f253f882a861a203.webp 330w,/project/split-keyboard/tented-keyboard-with-hands_hu_2035788559bc9ec3.webp 660w
 
 ,/project/split-keyboard/tented-keyboard-with-hands_hu_f14f0640fd72611c.webp 1024w
 
 
 ,/project/split-keyboard/tented-keyboard-with-hands_hu_b50687986eed5916.webp 1320w
 "
 
 sizes="100vw"
 type="image/webp"
 /&gt;
 
 &lt;img
 width="2400"
 height="1350"
 class="md:w-11/12 mx-auto my-0 rounded-sm"
 alt="Tentend split keyboard with hands"
 loading="lazy" decoding="async"
 
 
 src="https://jneidel.com/project/split-keyboard/tented-keyboard-with-hands_hu_caa0892d446d914d.jpg"
 srcset="https://jneidel.com/project/split-keyboard/tented-keyboard-with-hands_hu_3d1759147c5deeb1.jpg 330w,/project/split-keyboard/tented-keyboard-with-hands_hu_caa0892d446d914d.jpg 660w
 
 ,/project/split-keyboard/tented-keyboard-with-hands_hu_fbf64111c332c07f.jpg 1024w
 
 
 ,/project/split-keyboard/tented-keyboard-with-hands_hu_6ba2fdad3338d1d6.jpg 1320w
 "
 sizes="100vw"
 
 /&gt;
 &lt;/picture&gt;
 


 &lt;figcaption class="text-center"&gt;&lt;span class="figure-number"&gt;Figure 5: &lt;/span&gt;Demo of an inclined &amp;ldquo;tenting&amp;rdquo; setup.&lt;/figcaption&gt;
 &lt;/figure&gt;


&lt;p&gt;Finger are not the same length so a horizontal stagger can add comfort.&lt;/p&gt;

 
 
 
 
 
 
 

 
 
 

 
 

 
 
 &lt;figure class="md:w-10/12 mx-auto my-0 rounded-sm"&gt;
 
 
 









 
 &lt;picture
 class="md:w-10/12 mx-auto my-0 rounded-sm"
 
 &gt;
 
 
 

 
 &lt;source
 
 srcset="https://jneidel.com/project/split-keyboard/design-column-staggered_hu_952814dcf02d508d.webp 330w,/project/split-keyboard/design-column-staggered_hu_92e2b1da10e00103.webp 660w
 
 
 ,/project/split-keyboard/design-column-staggered_hu_69673f2abd3554a6.webp 842w
 
 
 
 
 ,/project/split-keyboard/design-column-staggered_hu_69673f2abd3554a6.webp 842w
 
 "
 
 sizes="100vw"
 type="image/webp"
 /&gt;
 
 &lt;img
 width="842"
 height="374"
 class="md:w-10/12 mx-auto my-0 rounded-sm"
 alt="The column staggered keyboad design"
 loading="lazy" decoding="async"
 
 
 src="https://jneidel.com/project/split-keyboard/design-column-staggered_hu_27ed3c68a312d335.png"
 srcset="https://jneidel.com/project/split-keyboard/design-column-staggered_hu_1202fd88ba6fb4f2.png 330w,/project/split-keyboard/design-column-staggered_hu_27ed3c68a312d335.png 660w
 
 ,/project/split-keyboard/design-column-staggered.png 842w
 
 
 ,/project/split-keyboard/design-column-staggered.png 842w
 "
 sizes="100vw"
 
 /&gt;
 &lt;/picture&gt;
 


 &lt;figcaption class="text-center"&gt;&lt;span class="figure-number"&gt;Figure 6: &lt;/span&gt;With a horizontal stagger. &lt;a href="https://svalboard.com/pages/the-layout" rel="external"&gt;Image credit&lt;/a&gt;&lt;/figcaption&gt;
 &lt;/figure&gt;


&lt;p&gt;The &lt;a href="https://svalboard.com/pages/the-layout" rel="external"&gt;best keyboard out there&lt;/a&gt; goes even further than that, but also comes with a
much higher price point, less portability and a significant learning curve.
I think the split keyboard will be the sweet spot for most people who want to
have a great external keyboard.&lt;/p&gt;
&lt;h2 id="building-process" class="relative group"&gt;Building process &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#building-process" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;What is not for most people, though, is soldering together their keyboard
themselves.
More on that later.
Let&amp;rsquo;s first choose a split keyboard design.&lt;/p&gt;
&lt;h3 id="picking-a-design" class="relative group"&gt;Picking a design &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#picking-a-design" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h3&gt;&lt;p&gt;The keyboard design should fit your needs.&lt;/p&gt;
&lt;p&gt;The first thing to wrap your head around is how a keyboard can even be as small
as this:&lt;/p&gt;

 
 
 
 
 
 
 

 
 
 

 
 

 
 
 &lt;figure class="md:w-10/12 mx-auto my-0 rounded-sm"&gt;
 
 
 









 
 &lt;picture
 class="md:w-10/12 mx-auto my-0 rounded-sm"
 
 &gt;
 
 
 

 
 &lt;source
 
 srcset="https://jneidel.com/project/split-keyboard/design-ferris_hu_8f1196a1c25895e2.webp 330w,/project/split-keyboard/design-ferris_hu_1682dcd160fbc928.webp 660w
 
 
 ,/project/split-keyboard/design-ferris_hu_538e6d3c0d441832.webp 870w
 
 
 
 
 ,/project/split-keyboard/design-ferris_hu_538e6d3c0d441832.webp 870w
 
 "
 
 sizes="100vw"
 type="image/webp"
 /&gt;
 
 &lt;img
 width="870"
 height="580"
 class="md:w-10/12 mx-auto my-0 rounded-sm"
 alt="The ferris keyboard design"
 loading="lazy" decoding="async"
 
 
 src="https://jneidel.com/project/split-keyboard/design-ferris_hu_c43b43136a0e940b.webp"
 srcset="https://jneidel.com/project/split-keyboard/design-ferris_hu_cecea8f36353bd9.webp 330w,/project/split-keyboard/design-ferris_hu_c43b43136a0e940b.webp 660w
 
 ,/project/split-keyboard/design-ferris.webp 870w
 
 
 ,/project/split-keyboard/design-ferris.webp 870w
 "
 sizes="100vw"
 
 /&gt;
 &lt;/picture&gt;
 


 &lt;figcaption class="text-center"&gt;&lt;span class="figure-number"&gt;Figure 7: &lt;/span&gt;There are only 34 keys on the Ferris. &lt;a href="https://splitkb.com/collections/keyboard-kits/products/halcyon-ferris" rel="external"&gt;Image credit&lt;/a&gt;&lt;/figcaption&gt;
 &lt;/figure&gt;


&lt;p&gt;You can and have to program these keyboards.
The Ferris can function because while you hold one of the arrow keys (in the bottom
right) with your thumb, the rest of the keyboard get redefined, the keys now
output something arbitrary you defined.
This is called a &lt;a href="https://jneidel.com/project/split-keyboard/#layer-it-on"&gt;layer&lt;/a&gt;.
If you don&amp;rsquo;t have a number row, you can add a number layer.
For example: usually you press &lt;kbd&gt;E&lt;/kbd&gt; and get &lt;kbd&gt;E&lt;/kbd&gt;, but if you hold the arrow key
and press &lt;kbd&gt;E&lt;/kbd&gt;, you can now get &lt;kbd&gt;3&lt;/kbd&gt;.&lt;/p&gt;
&lt;p&gt;Layering is powerful and really can&amp;rsquo;t (and shouldn&amp;rsquo;t) be avoided when building a
split keyboard.
There are also combos, mod-tap and more.
The fewer physical keys you have on the keyboard, the more reliant are you
on these techniques.
I knew, that as a beginner, I wanted a number row and many thumb keys.
That already significantly reduced my options, which is a good
thing.&lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;p&gt;I chose the &lt;a href="https://github.com/josefadamcik/SofleKeyboard" rel="external"&gt;Sofle&lt;/a&gt; design.
It has amount of keys I wanted, a comfortable stagger, plenty of thumb keys and
two encoders.&lt;/p&gt;

 
 
 
 
 
 
 

 
 
 

 
 

 
 
 &lt;figure class="md:w-11/12 mx-auto my-0 rounded-sm"&gt;
 
 
 









 
 &lt;picture
 class="md:w-11/12 mx-auto my-0 rounded-sm"
 
 &gt;
 
 
 

 
 &lt;source
 
 srcset="https://jneidel.com/project/split-keyboard/design-sofle_hu_b2dd6fd1a37bba6a.webp 330w,/project/split-keyboard/design-sofle_hu_f7a961ad9d17b122.webp 660w
 
 
 ,/project/split-keyboard/design-sofle_hu_819e33c0a6a7a557.webp 869w
 
 
 
 
 ,/project/split-keyboard/design-sofle_hu_819e33c0a6a7a557.webp 869w
 
 "
 
 sizes="100vw"
 type="image/webp"
 /&gt;
 
 &lt;img
 width="869"
 height="579"
 class="md:w-11/12 mx-auto my-0 rounded-sm"
 alt="The sofle keyboard design"
 loading="lazy" decoding="async"
 
 
 src="https://jneidel.com/project/split-keyboard/design-sofle_hu_d0e3e890e096a628.webp"
 srcset="https://jneidel.com/project/split-keyboard/design-sofle_hu_bcb3c1e51d4cc952.webp 330w,/project/split-keyboard/design-sofle_hu_d0e3e890e096a628.webp 660w
 
 ,/project/split-keyboard/design-sofle.webp 869w
 
 
 ,/project/split-keyboard/design-sofle.webp 869w
 "
 sizes="100vw"
 
 /&gt;
 &lt;/picture&gt;
 


 &lt;figcaption class="text-center"&gt;&lt;span class="figure-number"&gt;Figure 8: &lt;/span&gt;The Sofle design. &lt;a href="https://splitkb.com/collections/keyboard-kits/products/aurora-sofle-v2" rel="external"&gt;Image credit&lt;/a&gt;&lt;/figcaption&gt;
 &lt;/figure&gt;


&lt;p&gt;I chose &lt;a href="https://splitkb.com/collections/keyboard-kits" rel="external"&gt;splitkb.com&lt;/a&gt; as an EU-based vendor.
There I could buy everything I needed at once with guaranteed compatibility, a &lt;a href="https://canary.composer.splitkb.com/" rel="external"&gt;guided part-picker&lt;/a&gt;,
great documentation and no excessive shipping costs or import tax.&lt;/p&gt;
&lt;p&gt;The &lt;a href="https://splitkb.com/collections/keyboard-kits/products/aurora-sofle-v2" rel="external"&gt;Sofle kit&lt;/a&gt; requires me to solder the board myself.
If you don&amp;rsquo;t want to solder:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Splitkb also &lt;a href="https://splitkb.com/collections/keyboard-kits" rel="external"&gt;offers already soldered kits&lt;/a&gt; that you can just plug together.&lt;br /&gt;
You still get all of the choice (switches, keycaps, display, encoder, trackpad),
but without the manual labor. The price difference to self-soldering is a
no-brainer if you consider the labor and tools.&lt;/li&gt;
&lt;li&gt;Other vendors sell completely assembled keyboards at higher prices.
You get the working product, but none of the fun or choice of building.&lt;/li&gt;
&lt;li&gt;If you want to go dirt cheap you can go with AliExpress.
Search for your design and get a preassembled keyboard or hunt down all the
the parts you need.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Now to get my hands dirty.&lt;/p&gt;
&lt;h3 id="soldering-and-assembly" class="relative group"&gt;Soldering and assembly &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#soldering-and-assembly" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h3&gt;&lt;p&gt;The &lt;a href="https://docs.splitkb.com/product-guides/aurora-series/build-guide/what-is-what" rel="external"&gt;orientation guide&lt;/a&gt; helped me understand what all the parts were that I was
looking at and how they would play together to (hopefully) become a functioning
keyboard.&lt;/p&gt;

 
 
 
 
 
 
 

 
 
 

 
 

 
 
 &lt;figure class="md:w-12/12 mx-auto my-0 rounded-sm"&gt;
 
 
 









 
 &lt;picture
 class="md:w-12/12 mx-auto my-0 rounded-sm"
 
 &gt;
 
 
 

 
 &lt;source
 
 srcset="https://jneidel.com/project/split-keyboard/parts_hu_d1a62d0f9d4c7ff3.webp 330w,/project/split-keyboard/parts_hu_82bc4f000015c8da.webp 660w
 
 ,/project/split-keyboard/parts_hu_a3af8159616d54fa.webp 1024w
 
 
 ,/project/split-keyboard/parts_hu_3a635ae9bf2e078d.webp 1320w
 "
 
 sizes="100vw"
 type="image/webp"
 /&gt;
 
 &lt;img
 width="2400"
 height="1525"
 class="md:w-12/12 mx-auto my-0 rounded-sm"
 alt="Desk with keyboard parts on it"
 loading="lazy" decoding="async"
 
 
 src="https://jneidel.com/project/split-keyboard/parts_hu_bb3b676136aaeee.jpg"
 srcset="https://jneidel.com/project/split-keyboard/parts_hu_e5eb8992534f199a.jpg 330w,/project/split-keyboard/parts_hu_bb3b676136aaeee.jpg 660w
 
 ,/project/split-keyboard/parts_hu_1f0b042cecda20b1.jpg 1024w
 
 
 ,/project/split-keyboard/parts_hu_87009ad77011c1d3.jpg 1320w
 "
 sizes="100vw"
 
 /&gt;
 &lt;/picture&gt;
 


 &lt;figcaption class="text-center"&gt;&lt;span class="figure-number"&gt;Figure 9: &lt;/span&gt;The parts upon arrival.&lt;/figcaption&gt;
 &lt;/figure&gt;


&lt;h4 id="choose-the-firmware" class="relative group"&gt;Choose the firmware &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#choose-the-firmware" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h4&gt;&lt;p&gt;Before anything gets soldered, test that the microcontrollers work by &lt;a href="https://docs.splitkb.com/product-guides/aurora-series/build-guide/flashing-firmware" rel="external"&gt;flashing
their firmware&lt;/a&gt;.&lt;sup id="fnref:2"&gt;&lt;a href="#fn:2" class="footnote-ref" role="doc-noteref"&gt;2&lt;/a&gt;&lt;/sup&gt;
My options were:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;QMK: a text-based configuration language&lt;/li&gt;
&lt;li&gt;Vial: a GUI where you don&amp;rsquo;t need to mess with key-codes&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;As much as I like configuring stuff, QMK looked like overkill.
Vial was very easy to get into and is feature-complete for a beginners needs.&lt;/p&gt;

 
 
 
 
 
 
 

 
 
 

 
 

 
 
 &lt;figure class="w-10/12 md:w-9/12 mx-auto my-0 rounded-sm"&gt;
 
 
 









 
 &lt;picture
 class="w-10/12 md:w-9/12 mx-auto my-0 rounded-sm"
 
 &gt;
 
 
 

 
 &lt;source
 
 srcset="https://jneidel.com/project/split-keyboard/microcontroller-testing_hu_d4f6b8cd8404a057.webp 330w,/project/split-keyboard/microcontroller-testing_hu_6427cdd06776fe39.webp 660w
 
 ,/project/split-keyboard/microcontroller-testing_hu_3b38d87572b17bee.webp 1024w
 
 
 ,/project/split-keyboard/microcontroller-testing_hu_9c5a41d979ada1bf.webp 1320w
 "
 
 sizes="100vw"
 type="image/webp"
 /&gt;
 
 &lt;img
 width="1732"
 height="2400"
 class="w-10/12 md:w-9/12 mx-auto my-0 rounded-sm"
 alt="Microcontroller in front of laptop screen"
 loading="lazy" decoding="async"
 
 
 src="https://jneidel.com/project/split-keyboard/microcontroller-testing_hu_aa20bb77164ea32.jpg"
 srcset="https://jneidel.com/project/split-keyboard/microcontroller-testing_hu_6e258c1a8512277a.jpg 330w,/project/split-keyboard/microcontroller-testing_hu_aa20bb77164ea32.jpg 660w
 
 ,/project/split-keyboard/microcontroller-testing_hu_cca2ad9a63810e68.jpg 1024w
 
 
 ,/project/split-keyboard/microcontroller-testing_hu_e270ac5e54b20b3.jpg 1320w
 "
 sizes="100vw"
 
 /&gt;
 &lt;/picture&gt;
 


 &lt;figcaption class="text-center"&gt;&lt;span class="figure-number"&gt;Figure 10: &lt;/span&gt;Testing that the microcontroller outputs a &amp;ldquo;keypress.&amp;rdquo;&lt;/figcaption&gt;
 &lt;/figure&gt;


&lt;h4 id="soldering" class="relative group"&gt;Soldering &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#soldering" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h4&gt;
 
 
 
 
 
 
 

 
 
 

 
 

 
 
 &lt;figure class="md:w-11/12 mx-auto my-0 rounded-sm"&gt;
 
 
 









 
 &lt;picture
 class="md:w-11/12 mx-auto my-0 rounded-sm"
 
 &gt;
 
 
 

 
 &lt;source
 
 srcset="https://jneidel.com/project/split-keyboard/soldering-setup_hu_3b4c647505bf617e.webp 330w,/project/split-keyboard/soldering-setup_hu_c176da3b739fbace.webp 660w
 
 ,/project/split-keyboard/soldering-setup_hu_5ca596820a047046.webp 1024w
 
 
 ,/project/split-keyboard/soldering-setup_hu_314739df4b21aa37.webp 1320w
 "
 
 sizes="100vw"
 type="image/webp"
 /&gt;
 
 &lt;img
 width="2400"
 height="1350"
 class="md:w-11/12 mx-auto my-0 rounded-sm"
 alt="Desk with soldering equipment"
 loading="lazy" decoding="async"
 
 
 src="https://jneidel.com/project/split-keyboard/soldering-setup_hu_b13e386218f60292.jpg"
 srcset="https://jneidel.com/project/split-keyboard/soldering-setup_hu_c4e39f27f75c7cf4.jpg 330w,/project/split-keyboard/soldering-setup_hu_b13e386218f60292.jpg 660w
 
 ,/project/split-keyboard/soldering-setup_hu_bc2493f1006800b6.jpg 1024w
 
 
 ,/project/split-keyboard/soldering-setup_hu_70c212b9ff307770.jpg 1320w
 "
 sizes="100vw"
 
 /&gt;
 &lt;/picture&gt;
 


 &lt;figcaption class="text-center"&gt;&lt;span class="figure-number"&gt;Figure 11: &lt;/span&gt;My workstation.&lt;/figcaption&gt;
 &lt;/figure&gt;


&lt;p&gt;My soldering experience was limited to one 2h session, years ago.
I was basically a beginner.
Great that the first task is to &lt;a href="https://docs.splitkb.com/product-guides/aurora-series/build-guide/diodes#smd-diodes" rel="external"&gt;solder some tiny SMD diodes&lt;/a&gt;.
A task not recommended for beginners, but I knew it was gonna be fine and went fine.
Sure, the first 30 looked terrible, but I got better.
The second PCB went really smoothly (4x faster than first one.)&lt;/p&gt;

 
 
 
 
 
 
 

 
 
 

 
 

 
 
 &lt;figure class="w-12/12 mx-auto my-0 rounded-sm"&gt;
 
 
 









 
 &lt;picture
 class="w-12/12 mx-auto my-0 rounded-sm"
 
 &gt;
 
 
 

 
 &lt;source
 
 srcset="https://jneidel.com/project/split-keyboard/diodes_hu_8827e91fb53046c.webp 330w,/project/split-keyboard/diodes_hu_a241aed9e629af3c.webp 660w
 
 ,/project/split-keyboard/diodes_hu_7354143ee25ccbd5.webp 1024w
 
 
 ,/project/split-keyboard/diodes_hu_aa00dc1306a2fa89.webp 1320w
 "
 
 sizes="100vw"
 type="image/webp"
 /&gt;
 
 &lt;img
 width="2400"
 height="1350"
 class="w-12/12 mx-auto my-0 rounded-sm"
 alt="SMD diode on PCB"
 loading="lazy" decoding="async"
 
 
 src="https://jneidel.com/project/split-keyboard/diodes_hu_ef6982700ec4c6b9.jpg"
 srcset="https://jneidel.com/project/split-keyboard/diodes_hu_85e6c22d0ec9201b.jpg 330w,/project/split-keyboard/diodes_hu_ef6982700ec4c6b9.jpg 660w
 
 ,/project/split-keyboard/diodes_hu_48c6ac5ccbf0f4dd.jpg 1024w
 
 
 ,/project/split-keyboard/diodes_hu_f252863a63e6d28.jpg 1320w
 "
 sizes="100vw"
 
 /&gt;
 &lt;/picture&gt;
 


 &lt;figcaption class="text-center"&gt;&lt;span class="figure-number"&gt;Figure 12: &lt;/span&gt;A diode soldered to the PCB.&lt;/figcaption&gt;
 &lt;/figure&gt;


&lt;p&gt;Next were the &lt;a href="https://docs.splitkb.com/product-guides/aurora-series/build-guide/resistors#smd-resistors" rel="external"&gt;resistors&lt;/a&gt;.&lt;sup id="fnref:3"&gt;&lt;a href="#fn:3" class="footnote-ref" role="doc-noteref"&gt;3&lt;/a&gt;&lt;/sup&gt;
These were even smaller than the diodes. 🙂&lt;/p&gt;

 
 
 
 
 
 
 

 
 
 

 
 

 
 
 &lt;figure class="w-12/12 mx-auto my-0 rounded-sm"&gt;
 
 
 









 
 &lt;picture
 class="w-12/12 mx-auto my-0 rounded-sm"
 
 &gt;
 
 
 

 
 &lt;source
 
 srcset="https://jneidel.com/project/split-keyboard/resistors_hu_41d44972d2c534d7.webp 330w,/project/split-keyboard/resistors_hu_b5144e55ad1680df.webp 660w
 
 ,/project/split-keyboard/resistors_hu_604b2f7d9858e05f.webp 1024w
 
 
 ,/project/split-keyboard/resistors_hu_b4c0130d933953ae.webp 1320w
 "
 
 sizes="100vw"
 type="image/webp"
 /&gt;
 
 &lt;img
 width="2400"
 height="1350"
 class="w-12/12 mx-auto my-0 rounded-sm"
 alt="SMD resistors on PCB"
 loading="lazy" decoding="async"
 
 
 src="https://jneidel.com/project/split-keyboard/resistors_hu_8a4accb04aebb7d8.jpg"
 srcset="https://jneidel.com/project/split-keyboard/resistors_hu_7c588c76f5661e28.jpg 330w,/project/split-keyboard/resistors_hu_8a4accb04aebb7d8.jpg 660w
 
 ,/project/split-keyboard/resistors_hu_5c3016c30f7a1915.jpg 1024w
 
 
 ,/project/split-keyboard/resistors_hu_d0a67245bde2eddb.jpg 1320w
 "
 sizes="100vw"
 
 /&gt;
 &lt;/picture&gt;
 


 &lt;figcaption class="text-center"&gt;&lt;span class="figure-number"&gt;Figure 13: &lt;/span&gt;Resitors soldered to the PCB.&lt;/figcaption&gt;
 &lt;/figure&gt;


&lt;p&gt;With that I was done for day one after ~3h of soldering.&lt;/p&gt;
&lt;p&gt;For 8€ one can add &lt;a href="https://docs.splitkb.com/product-guides/aurora-series/build-guide/switch-sockets" rel="external"&gt;hotswap switch sockets&lt;/a&gt;.
Without them you&amp;rsquo;d solder the switches directly onto the board.
I chose what felt like the safer way, so that if I make a mistake or any switch
breaks I don&amp;rsquo;t have to do a big desoldering effort.
Which would be terrible (forshadowing.)&lt;/p&gt;

 
 
 
 
 
 
 

 
 
 

 
 

 
 
 &lt;figure class="w-12/12 mx-auto my-0 rounded-sm"&gt;
 
 
 









 
 &lt;picture
 class="w-12/12 mx-auto my-0 rounded-sm"
 
 &gt;
 
 
 

 
 &lt;source
 
 srcset="https://jneidel.com/project/split-keyboard/switch-sockets_hu_e559b32d99a4b0cc.webp 330w,/project/split-keyboard/switch-sockets_hu_65ee6d5131b9aee0.webp 660w
 
 ,/project/split-keyboard/switch-sockets_hu_87c78d6de05c92e5.webp 1024w
 
 
 ,/project/split-keyboard/switch-sockets_hu_6c39697f74198843.webp 1320w
 "
 
 sizes="100vw"
 type="image/webp"
 /&gt;
 
 &lt;img
 width="2400"
 height="1350"
 class="w-12/12 mx-auto my-0 rounded-sm"
 alt="Hotswap switch sockets on PCB"
 loading="lazy" decoding="async"
 
 
 src="https://jneidel.com/project/split-keyboard/switch-sockets_hu_f9f37505a6372c44.jpg"
 srcset="https://jneidel.com/project/split-keyboard/switch-sockets_hu_4efbdd77304bc134.jpg 330w,/project/split-keyboard/switch-sockets_hu_f9f37505a6372c44.jpg 660w
 
 ,/project/split-keyboard/switch-sockets_hu_bd73dd5f6d492cd.jpg 1024w
 
 
 ,/project/split-keyboard/switch-sockets_hu_f9c89213d72b7818.jpg 1320w
 "
 sizes="100vw"
 
 /&gt;
 &lt;/picture&gt;
 


 &lt;figcaption class="text-center"&gt;&lt;span class="figure-number"&gt;Figure 14: &lt;/span&gt;Sockets for easy switch replacement.&lt;/figcaption&gt;
 &lt;/figure&gt;


&lt;p&gt;Through-out the first half of the first board I&amp;rsquo;m thinking &amp;ldquo;Why is this so hard
to solder??? I thought I was good now!?&amp;rdquo;.
By the second board it had become routine.&lt;/p&gt;
&lt;p&gt;&lt;div class="flex flex-row justify-center items-start gap-2 [&amp;&gt;*]:min-w-0
 "&gt;
 


 
 
 
 
 
 
 

 
 
 

 
 

 
 
 &lt;figure class="w-12/12 mx-auto my-0 rounded-sm"&gt;
 
 
 









 
 &lt;picture
 class="w-12/12 mx-auto my-0 rounded-sm"
 
 &gt;
 
 
 

 
 &lt;source
 
 srcset="https://jneidel.com/project/split-keyboard/microcontroller3_hu_c1b30f15d58d94ee.webp 330w,/project/split-keyboard/microcontroller3_hu_7a6d8957f4e9912b.webp 660w
 
 ,/project/split-keyboard/microcontroller3_hu_e4c731cd6bd7431c.webp 1024w
 
 
 ,/project/split-keyboard/microcontroller3_hu_b4838260ceebcd44.webp 1320w
 "
 
 sizes="100vw"
 type="image/webp"
 /&gt;
 
 &lt;img
 width="1350"
 height="2400"
 class="w-12/12 mx-auto my-0 rounded-sm"
 alt="Pin to socket microcontroller"
 loading="lazy" decoding="async"
 
 
 src="https://jneidel.com/project/split-keyboard/microcontroller3_hu_dae20b4aa17e84f0.jpg"
 srcset="https://jneidel.com/project/split-keyboard/microcontroller3_hu_da683eadced5dd32.jpg 330w,/project/split-keyboard/microcontroller3_hu_dae20b4aa17e84f0.jpg 660w
 
 ,/project/split-keyboard/microcontroller3_hu_5fa23dc7f272be2a.jpg 1024w
 
 
 ,/project/split-keyboard/microcontroller3_hu_a1dab5bd985d05f8.jpg 1320w
 "
 sizes="100vw"
 
 /&gt;
 &lt;/picture&gt;
 


 
 &lt;/figure&gt;




 
 
 
 
 
 
 

 
 
 

 
 

 
 
 &lt;figure class="w-12/12 mx-auto my-0 rounded-sm"&gt;
 
 
 









 
 &lt;picture
 class="w-12/12 mx-auto my-0 rounded-sm"
 
 &gt;
 
 
 

 
 &lt;source
 
 srcset="https://jneidel.com/project/split-keyboard/microcontroller1_hu_79fb21f63d637367.webp 330w,/project/split-keyboard/microcontroller1_hu_d4bc10e5071100ba.webp 660w
 
 ,/project/split-keyboard/microcontroller1_hu_183e3de6c9fa7487.webp 1024w
 
 
 ,/project/split-keyboard/microcontroller1_hu_3b214adf083fde43.webp 1320w
 "
 
 sizes="100vw"
 type="image/webp"
 /&gt;
 
 &lt;img
 width="1350"
 height="2400"
 class="w-12/12 mx-auto my-0 rounded-sm"
 alt="Placing microcontroller socket pin"
 loading="lazy" decoding="async"
 
 
 src="https://jneidel.com/project/split-keyboard/microcontroller1_hu_78e43ec1722f1c11.jpg"
 srcset="https://jneidel.com/project/split-keyboard/microcontroller1_hu_3d3fa178a7f34b45.jpg 330w,/project/split-keyboard/microcontroller1_hu_78e43ec1722f1c11.jpg 660w
 
 ,/project/split-keyboard/microcontroller1_hu_2e738a710a32075e.jpg 1024w
 
 
 ,/project/split-keyboard/microcontroller1_hu_1e2d40e5b557516c.jpg 1320w
 "
 sizes="100vw"
 
 /&gt;
 &lt;/picture&gt;
 


 &lt;figcaption class="text-center"&gt;&lt;span class="figure-number"&gt;Figure 15: &lt;/span&gt;Preparing pins to &lt;a href="https://docs.splitkb.com/product-guides/aurora-series/build-guide/microcontrollers#using-sockets" rel="external"&gt;socket microcontroller&lt;/a&gt;.&lt;/figcaption&gt;
 &lt;/figure&gt;




 
 
 
 
 
 
 

 
 
 

 
 

 
 
 &lt;figure class="w-12/12 mx-auto my-0 rounded-sm"&gt;
 
 
 









 
 &lt;picture
 class="w-12/12 mx-auto my-0 rounded-sm"
 
 &gt;
 
 
 

 
 &lt;source
 
 srcset="https://jneidel.com/project/split-keyboard/microcontroller2_hu_86c866213889d92f.webp 330w,/project/split-keyboard/microcontroller2_hu_84b94fe812fa93d.webp 660w
 
 ,/project/split-keyboard/microcontroller2_hu_eaa3b20316cbf3e.webp 1024w
 
 
 ,/project/split-keyboard/microcontroller2_hu_c256dc510d536b9c.webp 1320w
 "
 
 sizes="100vw"
 type="image/webp"
 /&gt;
 
 &lt;img
 width="1350"
 height="2400"
 class="w-12/12 mx-auto my-0 rounded-sm"
 alt="Placed microcontroller pins in socket"
 loading="lazy" decoding="async"
 
 
 src="https://jneidel.com/project/split-keyboard/microcontroller2_hu_ceb7375443c98454.jpg"
 srcset="https://jneidel.com/project/split-keyboard/microcontroller2_hu_1c3cc1a157e8e793.jpg 330w,/project/split-keyboard/microcontroller2_hu_ceb7375443c98454.jpg 660w
 
 ,/project/split-keyboard/microcontroller2_hu_21a8e35d3401abb7.jpg 1024w
 
 
 ,/project/split-keyboard/microcontroller2_hu_baab74f1558a5b47.jpg 1320w
 "
 sizes="100vw"
 
 /&gt;
 &lt;/picture&gt;
 


 
 &lt;/figure&gt;




&lt;/div&gt;

&lt;br&gt;
&lt;div class="flex flex-row justify-center items-start gap-2 [&amp;&gt;*]:min-w-0
 "&gt;
 


 
 
 
 
 
 
 

 
 
 

 
 

 
 
 &lt;figure class="w-12/12 mx-auto my-0 rounded-sm"&gt;
 
 
 









 
 &lt;picture
 class="w-12/12 mx-auto my-0 rounded-sm"
 
 &gt;
 
 
 

 
 &lt;source
 
 srcset="https://jneidel.com/project/split-keyboard/microcontroller5_hu_45b176d84dc6d02b.webp 330w,/project/split-keyboard/microcontroller5_hu_88ee9ee20202d900.webp 660w
 
 ,/project/split-keyboard/microcontroller5_hu_b2b50760d1fa6a3e.webp 1024w
 
 
 ,/project/split-keyboard/microcontroller5_hu_f4e25f9fb490c0a8.webp 1320w
 "
 
 sizes="100vw"
 type="image/webp"
 /&gt;
 
 &lt;img
 width="2400"
 height="1350"
 class="w-12/12 mx-auto my-0 rounded-sm"
 alt="Empty socket"
 loading="lazy" decoding="async"
 
 
 src="https://jneidel.com/project/split-keyboard/microcontroller5_hu_296a7b86733573cc.jpg"
 srcset="https://jneidel.com/project/split-keyboard/microcontroller5_hu_869999f14bf59f7.jpg 330w,/project/split-keyboard/microcontroller5_hu_296a7b86733573cc.jpg 660w
 
 ,/project/split-keyboard/microcontroller5_hu_5878a240247f0b7e.jpg 1024w
 
 
 ,/project/split-keyboard/microcontroller5_hu_56c10169b2ab9bdd.jpg 1320w
 "
 sizes="100vw"
 
 /&gt;
 &lt;/picture&gt;
 


 
 &lt;/figure&gt;




 
 
 
 
 
 
 

 
 
 

 
 

 
 
 &lt;figure class="w-12/12 mx-auto my-0 rounded-sm"&gt;
 
 
 









 
 &lt;picture
 class="w-12/12 mx-auto my-0 rounded-sm"
 
 &gt;
 
 
 

 
 &lt;source
 
 srcset="https://jneidel.com/project/split-keyboard/microcontroller4_hu_41f44b8e5b06c390.webp 330w,/project/split-keyboard/microcontroller4_hu_545ef38a6c0df4ff.webp 660w
 
 ,/project/split-keyboard/microcontroller4_hu_19b48b73778ac60f.webp 1024w
 
 
 ,/project/split-keyboard/microcontroller4_hu_85e6873b04a3346a.webp 1320w
 "
 
 sizes="100vw"
 type="image/webp"
 /&gt;
 
 &lt;img
 width="2400"
 height="1350"
 class="w-12/12 mx-auto my-0 rounded-sm"
 alt="Microcontroller with pins"
 loading="lazy" decoding="async"
 
 
 src="https://jneidel.com/project/split-keyboard/microcontroller4_hu_27a510cf5e27afd5.jpg"
 srcset="https://jneidel.com/project/split-keyboard/microcontroller4_hu_a60bbc356fe7e30b.jpg 330w,/project/split-keyboard/microcontroller4_hu_27a510cf5e27afd5.jpg 660w
 
 ,/project/split-keyboard/microcontroller4_hu_f9c26ac8838cbd9c.jpg 1024w
 
 
 ,/project/split-keyboard/microcontroller4_hu_3298a0716a99e723.jpg 1320w
 "
 sizes="100vw"
 
 /&gt;
 &lt;/picture&gt;
 


 &lt;figcaption class="text-center"&gt;&lt;span class="figure-number"&gt;Figure 16: &lt;/span&gt;A microcontroller with pins soldered in can be easily removed from the socket.&lt;/figcaption&gt;
 &lt;/figure&gt;




&lt;/div&gt;

&lt;br&gt;
&lt;div class="flex flex-row justify-center items-start gap-2 [&amp;&gt;*]:min-w-0
 "&gt;
 


 
 
 
 
 
 
 

 
 
 

 
 

 
 
 &lt;figure class="md:w-10/12 mx-auto my-0 rounded-sm"&gt;
 
 
 









 
 &lt;picture
 class="md:w-10/12 mx-auto my-0 rounded-sm"
 
 &gt;
 
 
 

 
 &lt;source
 
 srcset="https://jneidel.com/project/split-keyboard/microcontroller6_hu_49955572e8d99d83.webp 330w,/project/split-keyboard/microcontroller6_hu_c8627d416329179e.webp 660w
 
 ,/project/split-keyboard/microcontroller6_hu_4b210f712ce4ccad.webp 1024w
 
 
 ,/project/split-keyboard/microcontroller6_hu_54e5cb9ec9eb3a78.webp 1320w
 "
 
 sizes="100vw"
 type="image/webp"
 /&gt;
 
 &lt;img
 width="1350"
 height="2400"
 class="md:w-10/12 mx-auto my-0 rounded-sm"
 alt="Pin to socket microcontroller"
 loading="lazy" decoding="async"
 
 
 src="https://jneidel.com/project/split-keyboard/microcontroller6_hu_38c6f159652b69cb.jpg"
 srcset="https://jneidel.com/project/split-keyboard/microcontroller6_hu_e24cd4473d429ce7.jpg 330w,/project/split-keyboard/microcontroller6_hu_38c6f159652b69cb.jpg 660w
 
 ,/project/split-keyboard/microcontroller6_hu_968efd3f174d3eaa.jpg 1024w
 
 
 ,/project/split-keyboard/microcontroller6_hu_9d0109ee5a1ffa3e.jpg 1320w
 "
 sizes="100vw"
 
 /&gt;
 &lt;/picture&gt;
 


 
 &lt;/figure&gt;




 
 
 
 
 
 
 

 
 
 

 
 

 
 
 &lt;figure class="md:w-10/12 mx-auto my-0 rounded-sm"&gt;
 
 
 









 
 &lt;picture
 class="md:w-10/12 mx-auto my-0 rounded-sm"
 
 &gt;
 
 
 

 
 &lt;source
 
 srcset="https://jneidel.com/project/split-keyboard/microcontroller7_hu_ee72fb22932b2554.webp 330w,/project/split-keyboard/microcontroller7_hu_b90b2dbb25f08072.webp 660w
 
 ,/project/split-keyboard/microcontroller7_hu_fae57fc47af83fc5.webp 1024w
 
 
 ,/project/split-keyboard/microcontroller7_hu_adf41bdeeb3673f.webp 1320w
 "
 
 sizes="100vw"
 type="image/webp"
 /&gt;
 
 &lt;img
 width="1350"
 height="2400"
 class="md:w-10/12 mx-auto my-0 rounded-sm"
 alt="Placed microcontroller pins in socket"
 loading="lazy" decoding="async"
 
 
 src="https://jneidel.com/project/split-keyboard/microcontroller7_hu_ed5b3a4092a283.jpg"
 srcset="https://jneidel.com/project/split-keyboard/microcontroller7_hu_8318b1e4df073527.jpg 330w,/project/split-keyboard/microcontroller7_hu_ed5b3a4092a283.jpg 660w
 
 ,/project/split-keyboard/microcontroller7_hu_7162a40ff21b571c.jpg 1024w
 
 
 ,/project/split-keyboard/microcontroller7_hu_5966e99f77bc0a9d.jpg 1320w
 "
 sizes="100vw"
 
 /&gt;
 &lt;/picture&gt;
 


 
 &lt;/figure&gt;




&lt;/div&gt;
&lt;/p&gt;
&lt;p&gt;As the last job for the day I wanted to do the &lt;a href="https://docs.splitkb.com/product-guides/aurora-series/build-guide/rotary-encoders" rel="external"&gt;rotary encoders&lt;/a&gt;:&lt;/p&gt;
&lt;div class="flex flex-row justify-center items-start gap-2 [&amp;&gt;*]:min-w-0
 "&gt;
 


 
 
 
 
 
 
 

 
 
 

 
 

 
 
 &lt;figure class="w-12/12 mx-auto my-0 rounded-sm"&gt;
 
 
 









 
 &lt;picture
 class="w-12/12 mx-auto my-0 rounded-sm"
 
 &gt;
 
 
 

 
 &lt;source
 
 srcset="https://jneidel.com/project/split-keyboard/encoder2_hu_6bc279a931f21456.webp 330w,/project/split-keyboard/encoder2_hu_a3b21f7c43afda11.webp 660w
 
 ,/project/split-keyboard/encoder2_hu_9d74adb985c3c0f8.webp 1024w
 
 
 ,/project/split-keyboard/encoder2_hu_cb0cefa7c30b9b15.webp 1320w
 "
 
 sizes="100vw"
 type="image/webp"
 /&gt;
 
 &lt;img
 width="2400"
 height="1350"
 class="w-12/12 mx-auto my-0 rounded-sm"
 alt="Installed encoder on PCB"
 loading="lazy" decoding="async"
 
 
 src="https://jneidel.com/project/split-keyboard/encoder2_hu_f457bdb74bce0cdd.jpg"
 srcset="https://jneidel.com/project/split-keyboard/encoder2_hu_a8d36b17ade3e6ae.jpg 330w,/project/split-keyboard/encoder2_hu_f457bdb74bce0cdd.jpg 660w
 
 ,/project/split-keyboard/encoder2_hu_67ad099ceba3677b.jpg 1024w
 
 
 ,/project/split-keyboard/encoder2_hu_602a6ec11c13f5b9.jpg 1320w
 "
 sizes="100vw"
 
 /&gt;
 &lt;/picture&gt;
 


 &lt;figcaption class="text-center"&gt;&lt;span class="figure-number"&gt;Figure 17: &lt;/span&gt;The installed encoder.&lt;/figcaption&gt;
 &lt;/figure&gt;




 
 
 
 
 
 
 

 
 
 

 
 

 
 
 &lt;figure class="w-12/12 mx-auto my-0 rounded-sm"&gt;
 
 
 









 
 &lt;picture
 class="w-12/12 mx-auto my-0 rounded-sm"
 
 &gt;
 
 
 

 
 &lt;source
 
 srcset="https://jneidel.com/project/split-keyboard/encoder3_hu_9369f200bb4f4c4d.webp 330w,/project/split-keyboard/encoder3_hu_c0c539521ee7a848.webp 660w
 
 ,/project/split-keyboard/encoder3_hu_7e0d094c514738d6.webp 1024w
 
 
 ,/project/split-keyboard/encoder3_hu_debf44aba9d3a4f8.webp 1320w
 "
 
 sizes="100vw"
 type="image/webp"
 /&gt;
 
 &lt;img
 width="2400"
 height="1350"
 class="w-12/12 mx-auto my-0 rounded-sm"
 alt="PCB with encoder and switches"
 loading="lazy" decoding="async"
 
 
 src="https://jneidel.com/project/split-keyboard/encoder3_hu_b09efe256d598451.jpg"
 srcset="https://jneidel.com/project/split-keyboard/encoder3_hu_637fc55b7b7a728d.jpg 330w,/project/split-keyboard/encoder3_hu_b09efe256d598451.jpg 660w
 
 ,/project/split-keyboard/encoder3_hu_de8dd88251486ccd.jpg 1024w
 
 
 ,/project/split-keyboard/encoder3_hu_3cfea9df65af617.jpg 1320w
 "
 sizes="100vw"
 
 /&gt;
 &lt;/picture&gt;
 


 &lt;figcaption class="text-center"&gt;&lt;span class="figure-number"&gt;Figure 18: &lt;/span&gt;Finished encoder with it&amp;rsquo;s hat on.&lt;/figcaption&gt;
 &lt;/figure&gt;




&lt;/div&gt;

&lt;p&gt;At the end of a 5h session I fuck up by soldering then encoder onto the wrong side of the
board.
Ouch.
It only take one moment of inattention to mess up terribly.&lt;/p&gt;

 
 
 
 
 
 
 

 
 
 

 
 

 
 
 &lt;figure class="w-12/12 mx-auto my-0 rounded-sm"&gt;
 
 
 









 
 &lt;picture
 class="w-12/12 mx-auto my-0 rounded-sm"
 
 &gt;
 
 
 

 
 &lt;source
 
 srcset="https://jneidel.com/project/split-keyboard/encoder4_hu_622815c986016745.webp 330w,/project/split-keyboard/encoder4_hu_5595f0793bb39314.webp 660w
 
 ,/project/split-keyboard/encoder4_hu_dbc3bdfca200b772.webp 1024w
 
 
 ,/project/split-keyboard/encoder4_hu_ae14f08927539a76.webp 1320w
 "
 
 sizes="100vw"
 type="image/webp"
 /&gt;
 
 &lt;img
 width="2400"
 height="1350"
 class="w-12/12 mx-auto my-0 rounded-sm"
 alt="PCB with encoder on the wrong side"
 loading="lazy" decoding="async"
 
 
 src="https://jneidel.com/project/split-keyboard/encoder4_hu_dd4e4df855bd859e.jpg"
 srcset="https://jneidel.com/project/split-keyboard/encoder4_hu_70699e6ec5a3d7d7.jpg 330w,/project/split-keyboard/encoder4_hu_dd4e4df855bd859e.jpg 660w
 
 ,/project/split-keyboard/encoder4_hu_db1d62dc58c04cc9.jpg 1024w
 
 
 ,/project/split-keyboard/encoder4_hu_96fdf927754d2278.jpg 1320w
 "
 sizes="100vw"
 
 /&gt;
 &lt;/picture&gt;
 


 &lt;figcaption class="text-center"&gt;&lt;span class="figure-number"&gt;Figure 19: &lt;/span&gt;Yes, that is the wrong way around.&lt;/figcaption&gt;
 &lt;/figure&gt;


&lt;p&gt;I tried to desolder the encoder but it was not possible with my current tool.
So, I went to the store and bought a new 30W iron.
That also did not work.
(Afterwards I found out that I needed the soldering iron with &amp;gt;30W that was marked as
&amp;ldquo;unsafe for PCBs.&amp;rdquo;
It is safe if you know what you are doing, which I wasn&amp;rsquo;t &amp;mdash; so
maybe it&amp;rsquo;s for the best. 😄) &lt;br /&gt;
Either way.
I found &lt;a href="https://www.kleinanzeigen.de/s-anzeige/-loetarbeiten-platinen-reparaturen-express-service-loeten/3165576566-226-3447" rel="external"&gt;a place in Berlin&lt;/a&gt; that does walk-in soldering work.
After a two-hour train ride and 5-minute visit my board was fixed.&lt;/p&gt;
&lt;p&gt;I put everything together, fixed some connections and tested the keys through
Vials &amp;ldquo;Matrix Tester&amp;rdquo;.
Everything worked, except for one row of keys.&lt;br /&gt;
I checked my soldering, redid connections, but &amp;hellip; nothing.
At some point I switch the microcontrollers and the dead row switches with along
with it.
A microcontroller problem it is.&lt;/p&gt;

 
 
 
 
 
 
 

 
 
 

 
 

 
 
 &lt;figure class="w-12/12 mx-auto my-0 rounded-sm"&gt;
 
 
 









 
 &lt;picture
 class="w-12/12 mx-auto my-0 rounded-sm"
 
 &gt;
 
 
 

 
 &lt;source
 
 srcset="https://jneidel.com/project/split-keyboard/vial-dead-row_hu_9d6732f0e6d6fe44.webp 330w,/project/split-keyboard/vial-dead-row_hu_80de424e7fd575d0.webp 660w
 
 ,/project/split-keyboard/vial-dead-row_hu_51dbcd89fc333e63.webp 1024w
 
 
 ,/project/split-keyboard/vial-dead-row_hu_7cac73ebf4082457.webp 1320w
 "
 
 sizes="100vw"
 type="image/webp"
 /&gt;
 
 &lt;img
 width="1920"
 height="1006"
 class="w-12/12 mx-auto my-0 rounded-sm"
 alt="Vial matrix tester showing a dead row of keys"
 loading="lazy" decoding="async"
 
 
 src="https://jneidel.com/project/split-keyboard/vial-dead-row_hu_9475d695bea1d21c.png"
 srcset="https://jneidel.com/project/split-keyboard/vial-dead-row_hu_b7776e78bbb52f25.png 330w,/project/split-keyboard/vial-dead-row_hu_9475d695bea1d21c.png 660w
 
 ,/project/split-keyboard/vial-dead-row_hu_33f3f3b113f2010a.png 1024w
 
 
 ,/project/split-keyboard/vial-dead-row_hu_e00d789841541c9c.png 1320w
 "
 sizes="100vw"
 
 /&gt;
 &lt;/picture&gt;
 


 &lt;figcaption class="text-center"&gt;&lt;span class="figure-number"&gt;Figure 20: &lt;/span&gt;Vial shows a dead row of keys.&lt;/figcaption&gt;
 &lt;/figure&gt;


&lt;p&gt;After the newly ordered microcontroller arrived, was soldered up and put in,
everything finally worked!&lt;/p&gt;

 
 
 
 
 
 
 

 
 
 

 
 

 
 
 &lt;figure class="w-12/12 mx-auto my-0 rounded-sm"&gt;
 
 
 









 
 &lt;picture
 class="w-12/12 mx-auto my-0 rounded-sm"
 
 &gt;
 
 
 

 
 &lt;source
 
 srcset="https://jneidel.com/project/split-keyboard/end-result_hu_88e53afddf644574.webp 330w,/project/split-keyboard/end-result_hu_2e495e911e7f90c3.webp 660w
 
 ,/project/split-keyboard/end-result_hu_7c838d2140ed3c70.webp 1024w
 
 
 ,/project/split-keyboard/end-result_hu_61c842870d799006.webp 1320w
 "
 
 sizes="100vw"
 type="image/webp"
 /&gt;
 
 &lt;img
 width="2400"
 height="1350"
 class="w-12/12 mx-auto my-0 rounded-sm"
 alt="Vial matrix tester showing a dead row of keys"
 loading="lazy" decoding="async"
 
 
 src="https://jneidel.com/project/split-keyboard/end-result_hu_f84638b248f13877.jpg"
 srcset="https://jneidel.com/project/split-keyboard/end-result_hu_a66b28909e82d7d3.jpg 330w,/project/split-keyboard/end-result_hu_f84638b248f13877.jpg 660w
 
 ,/project/split-keyboard/end-result_hu_b4142cb2c5ac17e4.jpg 1024w
 
 
 ,/project/split-keyboard/end-result_hu_7eeaba6aed8586cd.jpg 1320w
 "
 sizes="100vw"
 
 /&gt;
 &lt;/picture&gt;
 


 &lt;figcaption class="text-center"&gt;&lt;span class="figure-number"&gt;Figure 21: &lt;/span&gt;The final result.&lt;/figcaption&gt;
 &lt;/figure&gt;


&lt;p&gt;From initial research to completion the build took around 20 days and ca. 13h of soldering and
hardware debugging.&lt;/p&gt;
&lt;h3 id="cost-overview" class="relative group"&gt;Cost overview &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#cost-overview" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h3&gt;&lt;p&gt;Here&amp;rsquo;s what I paid for my kit, plus the unexpected costs:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://splitkb.com/collections/keyboard-kits/products/aurora-sofle-v2" rel="external"&gt;Aurora Sofle Kit&lt;/a&gt;, switches, keycaps, microcontrollers, case, encoders and more: 226€&lt;/li&gt;
&lt;li&gt;2m USB-C cable: 5€&lt;/li&gt;
&lt;li&gt;Reordered a microcontroller: 31€&lt;/li&gt;
&lt;li&gt;Bought a new soldering iron, which turned out to be only marginally better than old one: 43€&lt;/li&gt;
&lt;li&gt;Had a professional fix the encoder soldering mistake of mine: 20€&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Total: 325€&lt;/strong&gt; plus ~13 hours of my time.&lt;/p&gt;
&lt;h2 id="configuration" class="relative group"&gt;Configuration &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#configuration" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;My keyboard is smaller than a full-keyboard.
Some of the standard keys are missing for lack of space.
Through configuration they will be made available.&lt;/p&gt;
&lt;p&gt;For Vial configuration is done through the local app.&lt;sup id="fnref:4"&gt;&lt;a href="#fn:4" class="footnote-ref" role="doc-noteref"&gt;4&lt;/a&gt;&lt;/sup&gt;
Vial needs the devices &lt;code&gt;/dev/hidraw*&lt;/code&gt; to be writable.
This can be done with:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ls -tc /dev/hidraw* &lt;span class="p"&gt;|&lt;/span&gt; head -n3 &lt;span class="p"&gt;|&lt;/span&gt; tr &lt;span class="s2"&gt;&amp;#34;\n&amp;#34;&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34; &amp;#34;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; xargs sudo chmod a+rw
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;I run this through an &lt;a href="https://jneidel.com/dev/linux-usb-c-dock-udev/"&gt;udev rule on device connect&lt;/a&gt; that calls &lt;a href="https://github.com/jneidel/dotfiles/blob/master/scripts/hardware/split-keyboard" rel="external"&gt;this script&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id="thumb-keys-for-modifiers" class="relative group"&gt;Thumb keys for modifiers &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#thumb-keys-for-modifiers" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h3&gt;&lt;p&gt;First up are the ten thumb keys.
The requirement for my keyboard (configuration) was that it works well with Emacs.
There is a lot of holding down &lt;kbd&gt;Control&lt;/kbd&gt; in Emacs.
Since the thumb is our strongest finger I wanted have it hold down that (and other)
modifiers.&lt;/p&gt;
&lt;p&gt;With one on each hand (2/10):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;2x &lt;kbd&gt;Control&lt;/kbd&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Then I have (4/10):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;kbd&gt;Super&lt;/kbd&gt;: window management&lt;/li&gt;
&lt;li&gt;&lt;a href="https://jneidel.com/dev/hyper-modifier/"&gt;Hyper&lt;/a&gt;&lt;sup id="fnref:5"&gt;&lt;a href="#fn:5" class="footnote-ref" role="doc-noteref"&gt;5&lt;/a&gt;&lt;/sup&gt;: Emacs bindings&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Emacs also has bindings with two modifiers plus shift
(&lt;kbd&gt;control+meta+shift+something&lt;/kbd&gt;), so I needed a shift outside of the thumb keys.
The other goes shift goes onto the thumbs (5/10):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;kbd&gt;Shift&lt;/kbd&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;With usage I quickly realized that the outermost keys were very hard to hit
consistently and that the travel between the innermost to the outmost was
slowing me down.
I basically don&amp;rsquo;t use them now (7/10).&lt;/p&gt;
&lt;p&gt;I only have 3 spaces left now and it needs to be these three (10/10):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;kbd&gt;Alt&lt;/kbd&gt;&lt;/li&gt;
&lt;li&gt;&lt;kbd&gt;Spacebar&lt;/kbd&gt;&lt;/li&gt;
&lt;li&gt;Layer change: see next section&lt;/li&gt;
&lt;/ul&gt;

 
 
 
 
 
 
 

 
 
 

 
 

 
 
 &lt;figure class="md:w-12/12 mx-auto my-0 rounded-sm"&gt;
 
 
 









 
 &lt;picture
 class="md:w-12/12 mx-auto my-0 rounded-sm"
 
 &gt;
 
 
 

 
 &lt;source
 
 srcset="https://jneidel.com/project/split-keyboard/layer0_hu_2a6770ed39d47bbc.webp 330w,/project/split-keyboard/layer0_hu_1cc0bc66bc4831a4.webp 660w
 
 ,/project/split-keyboard/layer0_hu_37ce1f21ff07a3f0.webp 1024w
 
 
 
 ,/project/split-keyboard/layer0_hu_57125f67069325c8.webp 1144w
 
 "
 
 sizes="100vw"
 type="image/webp"
 /&gt;
 
 &lt;img
 width="1144"
 height="407"
 class="md:w-12/12 mx-auto my-0 rounded-sm"
 alt="Vial configuration for layer 0"
 loading="lazy" decoding="async"
 
 
 src="https://jneidel.com/project/split-keyboard/layer0_hu_887c9a821b01a396.png"
 srcset="https://jneidel.com/project/split-keyboard/layer0_hu_93f4996d3f8d8231.png 330w,/project/split-keyboard/layer0_hu_887c9a821b01a396.png 660w
 
 ,/project/split-keyboard/layer0_hu_97595a8a1c797a2e.png 1024w
 
 
 ,/project/split-keyboard/layer0.png 1144w
 "
 sizes="100vw"
 
 /&gt;
 &lt;/picture&gt;
 


 &lt;figcaption class="text-center"&gt;&lt;span class="figure-number"&gt;Figure 22: &lt;/span&gt;Base layer with my arrangement of thumbkeys (&lt;code&gt;MO(n)&lt;/code&gt; is a layer change.)&lt;/figcaption&gt;
 &lt;/figure&gt;


&lt;p&gt;I tried enter on a thumb key, but multiple Emacs org-mode bindings use two
modifiers (two thumbs) plus enter.&lt;/p&gt;
&lt;h3 id="layer-it-on" class="relative group"&gt;Layer it on! &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#layer-it-on" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h3&gt;&lt;p&gt;A layer allows you to transform all keys on the keyboard.
Here is what I get when I go into layer one:&lt;/p&gt;

 
 
 
 
 
 
 

 
 
 

 
 

 
 
 &lt;figure class="md:w-11/12 mx-auto my-0 rounded-sm"&gt;
 
 
 









 
 &lt;picture
 class="md:w-11/12 mx-auto my-0 rounded-sm"
 
 &gt;
 
 
 

 
 &lt;source
 
 srcset="https://jneidel.com/project/split-keyboard/layer1_hu_c4550a285d51605d.webp 330w,/project/split-keyboard/layer1_hu_91f6b251dfee3b12.webp 660w
 
 ,/project/split-keyboard/layer1_hu_bbc34139ff8cd8e4.webp 1024w
 
 
 
 ,/project/split-keyboard/layer1_hu_359f52b02797737d.webp 1090w
 
 "
 
 sizes="100vw"
 type="image/webp"
 /&gt;
 
 &lt;img
 width="1090"
 height="397"
 class="md:w-11/12 mx-auto my-0 rounded-sm"
 alt="Vial configuration for layer 1"
 loading="lazy" decoding="async"
 
 
 src="https://jneidel.com/project/split-keyboard/layer1_hu_6d42ba04690f51de.png"
 srcset="https://jneidel.com/project/split-keyboard/layer1_hu_eb9929b96031facb.png 330w,/project/split-keyboard/layer1_hu_6d42ba04690f51de.png 660w
 
 ,/project/split-keyboard/layer1_hu_8c073be3d5ba4d51.png 1024w
 
 
 ,/project/split-keyboard/layer1.png 1090w
 "
 sizes="100vw"
 
 /&gt;
 &lt;/picture&gt;
 


 &lt;figcaption class="text-center"&gt;&lt;span class="figure-number"&gt;Figure 23: &lt;/span&gt;Special characters layer.&lt;/figcaption&gt;
 &lt;/figure&gt;


&lt;p&gt;You can see that I make keys accessible that are missing (&lt;kbd&gt;#&lt;/kbd&gt;, &lt;kbd&gt;*&lt;/kbd&gt;, &lt;kbd&gt;ß&lt;/kbd&gt;, etc.) or so common that I
want them more easily available (&lt;kbd&gt;&amp;quot;&lt;/kbd&gt;, &lt;kbd&gt;?&lt;/kbd&gt;, &lt;kbd&gt;()&lt;/kbd&gt;, etc.)&lt;/p&gt;
&lt;p&gt;Other people make much heavier use of layers than me.
They have layers for numbers, special characters, movement, media, etc.
I chose a keyboard with a number row, so I wouldn&amp;rsquo;t need to do this.
After trying more layers I decided against it.&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;Why not use layers more heavily?&lt;/summary&gt;
&lt;p&gt;If I had more layers I would need more modifiers to activate them.
I&amp;rsquo;m all out of thumb keys, so I would need to do mod-tap outside of my thumbs.
Holding a layer modifier with the left hand, makes it hard/uncomfortable to hit a keybinding with the same.
So if I had a numbers layer and numbers on both hands I would need a mod-tap on
both hand to activate the layer.&lt;/p&gt;
&lt;p&gt;Mod-tap introduces a configurable delay (200ms) for regular key-presses.
In typing tests the mod-tap on an infrequent key like &lt;kbd&gt;ö&lt;/kbd&gt; (&lt;kbd&gt;;&lt;/kbd&gt; on US-querty) was
both noticeable and bothersome.
I would not want to have any more, especially not on frequently used keys like
those on the home row.&lt;/p&gt;
&lt;/details&gt;
&lt;h3 id="knobs--encoders" class="relative group"&gt;Knobs (Encoders) &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#knobs--encoders" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h3&gt;&lt;p&gt;Those rotary encoders are actually quite flexible.
For their functions I have settled on volume control and left/right (for video
control.)
And on press down it runs the sequence &lt;kbd&gt;C-x 1&lt;/kbd&gt; &amp;ndash; Emacs&amp;rsquo; &lt;code&gt;delete-other-windows&lt;/code&gt; &amp;ndash; which is very
convenient.&lt;/p&gt;
&lt;p&gt;I experimented with them as page up/down for webpage and document scroll, but I
did not use it much.
What I did use was Emacs&amp;rsquo; &lt;code&gt;other-window&lt;/code&gt; in the direction that I was turning the
knob.
That was quite cool and I used it plenty, but to have the volume and
forward/backward available outside of a layer was more important.&lt;/p&gt;
&lt;h2 id="adjustment-period" class="relative group"&gt;Adjustment period &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#adjustment-period" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;To get back to your usual typing speed and muscle memory on a new keyword will
take time and conscious effort.
For me these were the points where I felt the pain:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Orthogonal&lt;sup id="fnref:6"&gt;&lt;a href="#fn:6" class="footnote-ref" role="doc-noteref"&gt;6&lt;/a&gt;&lt;/sup&gt; key placement and related bad habits.&lt;/li&gt;
&lt;li&gt;Special characters in new places.&lt;/li&gt;
&lt;li&gt;Keyboard shortcuts are completely different.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The orthogonal layout meant that keys were in slightly different places (e.g. straight
up from the home row, instead of up and sideways.)
Though this was the least of my trouble.
My touch typing mistakes were much worse.&lt;/p&gt;

 
 
 
 
 
 
 

 
 
 

 
 

 
 
 &lt;figure class="w-12/12 mx-auto my-0 rounded-sm"&gt;
 
 
 









 
 &lt;picture
 class="w-12/12 mx-auto my-0 rounded-sm"
 
 &gt;
 
 
 

 
 &lt;source
 
 srcset="https://jneidel.com/project/split-keyboard/touch-typing-rules_hu_e8263d9a5f021ac.webp 330w,/project/split-keyboard/touch-typing-rules_hu_2dd902847c5a70e3.webp 660w
 
 ,/project/split-keyboard/touch-typing-rules_hu_cc69235b8ec8d02b.webp 1024w
 
 
 
 ,/project/split-keyboard/touch-typing-rules_hu_5bba19f46d54f5ae.webp 1160w
 
 "
 
 sizes="100vw"
 type="image/webp"
 /&gt;
 
 &lt;img
 width="1160"
 height="466"
 class="w-12/12 mx-auto my-0 rounded-sm"
 alt="The touch typing rules"
 loading="lazy" decoding="async"
 
 
 src="https://jneidel.com/project/split-keyboard/touch-typing-rules_hu_ce6d2b387253b6c1.png"
 srcset="https://jneidel.com/project/split-keyboard/touch-typing-rules_hu_6dcc6d953e5b2514.png 330w,/project/split-keyboard/touch-typing-rules_hu_ce6d2b387253b6c1.png 660w
 
 ,/project/split-keyboard/touch-typing-rules_hu_943ff17293eb59a7.png 1024w
 
 
 ,/project/split-keyboard/touch-typing-rules.png 1160w
 "
 sizes="100vw"
 
 /&gt;
 &lt;/picture&gt;
 


 &lt;figcaption class="text-center"&gt;&lt;span class="figure-number"&gt;Figure 24: &lt;/span&gt;The touch typing rules show that &lt;kbd&gt;B&lt;/kbd&gt; belongs to the left index finger.&lt;/figcaption&gt;
 &lt;/figure&gt;


&lt;p&gt;On a staggered keyboard &lt;kbd&gt;B&lt;/kbd&gt; is equally close to both index fingers on the home row
and I used them interchangeably.
On a split orthogonal keyboard &lt;kbd&gt;B&lt;/kbd&gt; is on the left hand.
For me that meant that my right index finger needed to unlearn that it could hit
a &lt;kbd&gt;B&lt;/kbd&gt; by going down and left.&lt;/p&gt;

 
 
 
 
 
 
 

 
 
 

 
 

 
 
 &lt;figure class="w-10/12 mx-auto my-0 rounded-sm"&gt;
 
 
 









 
 &lt;picture
 class="w-10/12 mx-auto my-0 rounded-sm"
 
 &gt;
 
 
 

 
 &lt;source
 
 srcset="https://jneidel.com/project/split-keyboard/design-split_hu_a3c117ed627352f7.webp 330w,/project/split-keyboard/design-split_hu_dfb8c8bbb586b1cb.webp 660w
 
 
 ,/project/split-keyboard/design-split_hu_30ac8fdb7580f72f.webp 787w
 
 
 
 
 ,/project/split-keyboard/design-split_hu_30ac8fdb7580f72f.webp 787w
 
 "
 
 sizes="100vw"
 type="image/webp"
 /&gt;
 
 &lt;img
 width="787"
 height="333"
 class="w-10/12 mx-auto my-0 rounded-sm"
 alt="The ortholinear keyboad design"
 loading="lazy" decoding="async"
 
 
 src="https://jneidel.com/project/split-keyboard/design-split_hu_8d9192af4190d89e.png"
 srcset="https://jneidel.com/project/split-keyboard/design-split_hu_12a48b0e17af2e8d.png 330w,/project/split-keyboard/design-split_hu_8d9192af4190d89e.png 660w
 
 ,/project/split-keyboard/design-split.png 787w
 
 
 ,/project/split-keyboard/design-split.png 787w
 "
 sizes="100vw"
 
 /&gt;
 &lt;/picture&gt;
 


 &lt;figcaption class="text-center"&gt;&lt;span class="figure-number"&gt;Figure 25: &lt;/span&gt;On a split orthogonal keyboard &lt;kbd&gt;B&lt;/kbd&gt; can only be reached by the left index.&lt;/figcaption&gt;
 &lt;/figure&gt;


&lt;p&gt;Many special characters moved to layers as I already said.
This too, took some getting used to.
And while most letter keys were in the same place, the few that weren&amp;rsquo;t (the
German &lt;kbd&gt;ä&lt;/kbd&gt; &amp;amp; &lt;kbd&gt;ß&lt;/kbd&gt;) threw off my writing speed.&lt;/p&gt;
&lt;p&gt;But the hardest part were the keyboard shortcut that I had deeply etched into my
muscle memory.
Modifiers were now in different places.
Key combinations used a different set of fingers.
I had to look up some binding again and again because I just did not know them.
They had been committed to muscle memory years ago and I had long forgotten what
keys I needed to press.&lt;/p&gt;
&lt;h3 id="typing-practice" class="relative group"&gt;Typing practice &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#typing-practice" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h3&gt;&lt;p&gt;Typing tests are a great way to reduce typing friction and improve speed through
deliberate practice.
I used the full-featured website &lt;a href="https://monkeytype.com/" rel="external"&gt;monkeytype&lt;/a&gt;.&lt;sup id="fnref:7"&gt;&lt;a href="#fn:7" class="footnote-ref" role="doc-noteref"&gt;7&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;p&gt;On my laptop keyboard I was at a comfortable 60wpm in English.
I started out at an abysmal 10wpm on the new keyboard.
I practiced regularly and added multiple increases in difficulty.
I switched to German (more
capitalization, harder combined words and ö, ä, ü, ß), added numbers and
punctuation.
It took me about 14h of deliberate practice &lt;a href="https://monkeytype.com/profile/jneidel" rel="external"&gt;to get up to 60wpm&lt;/a&gt; on the new keyboard too.&lt;/p&gt;
&lt;p&gt;I saw the best progress when I drilled the &amp;ldquo;missed words&amp;rdquo; after a test, focused
on accuracy over speed and stopped for the day when I hit a plateau.&lt;/p&gt;
&lt;h2 id="conclusions" class="relative group"&gt;Conclusions &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#conclusions" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;With that we have arrived in the present.
A lot of work went into this project in building, configuring and adjusting to
this new keyboard.
I am left with a nicer computer setup for years to come.
To me that was time well invested.
And I enjoyed myself in the process.&lt;/p&gt;
&lt;p&gt;I hope you feel inspired to do something like this for yourself (if you&amp;rsquo;re into
this kind of thing.) 🙂&lt;/p&gt;
&lt;p&gt;Much love,&lt;br /&gt;
Jonathan&lt;/p&gt;
&lt;h2 id="references" class="relative group"&gt;References &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#references" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="https://jneidel.com/dev/consistent-keybindings-across-os/"&gt;Consistent keybindings across macOS and linux&lt;/a&gt; (same copy-paste and more.)
This is especially useful with a shared external keyboard.&lt;/li&gt;
&lt;li&gt;The ultimate keyboard still awaits: the &lt;a href="https://svalboard.com/" rel="external"&gt;Svalboard&lt;/a&gt;. 3d printing and building this is someday
project for me.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gist.github.com/henfiber/a17c7b2a7053473fe37b1a6f80e58efd" rel="external"&gt;List of EU vendors for keyboards and keyboard components&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Video: &lt;a href="https://www.youtube.com/watch?v=DUa1q_XpTEw" rel="external"&gt;How to solder keyboards&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="footnotes" role="doc-endnotes"&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id="fn:1"&gt;
&lt;p&gt;See &lt;a href="https://en.wikipedia.org/wiki/Analysis_paralysis" rel="external"&gt;Decision paralysis aka. Analysis paralysis&lt;/a&gt;.&amp;#160;&lt;a href="#fnref:1" class="footnote-backref" role="doc-backlink"&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:2"&gt;
&lt;p&gt;Quick notes for flashing the firmware: Plug in the keyboard, mount it
as a drive, move the vial .uf2 file onto the drive and test that it works as an
input (as seen in the picture.)&amp;#160;&lt;a href="#fnref:2" class="footnote-backref" role="doc-backlink"&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:3"&gt;
&lt;p&gt;The resistors were optional for me, since I didn&amp;rsquo;t plan to add screens.
I just put them on the board to be future-proof.&amp;#160;&lt;a href="#fnref:3" class="footnote-backref" role="doc-backlink"&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:4"&gt;
&lt;p&gt;Why not &lt;a href="https://vial.rocks/" rel="external"&gt;vial.rocks&lt;/a&gt;? It works, but the local app is faster and
remembers what device was last used and that I selected the german layout.&amp;#160;&lt;a href="#fnref:4" class="footnote-backref" role="doc-backlink"&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:5"&gt;
&lt;p&gt;What is the hyper key and why would I want one?
&lt;a href="https://jneidel.com/dev/hyper-modifier/"&gt;See this article&lt;/a&gt;.
Why not use the hyper key &lt;a href="https://docs.qmk.fm/feature_advanced_keycodes#modifier-keys" rel="external"&gt;built-in to QMK/Vial&lt;/a&gt; (&lt;code&gt;HYPR(kc)&lt;/code&gt;)?
It does not produce a real hyper output in Emacs.
I don&amp;rsquo;t want &lt;kbd&gt;ctrl+alt+shift+gui&lt;/kbd&gt; I want a real hyper.&amp;#160;&lt;a href="#fnref:5" class="footnote-backref" role="doc-backlink"&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:6"&gt;
&lt;p&gt;What is an orthogonal layout? &lt;a href="https://jneidel.com/project/split-keyboard/#what-is-the-best-external-keyboard"&gt;See the beginning of the article&lt;/a&gt;.&amp;#160;&lt;a href="#fnref:6" class="footnote-backref" role="doc-backlink"&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:7"&gt;
&lt;p&gt;I decided on monkeytype because it was 1) well recommended by
relevant reddit communities, 2) full-featured and heavily configurable, 3)
open-source. I&amp;rsquo;m very happy with my choice.&amp;#160;&lt;a href="#fnref:7" class="footnote-backref" role="doc-backlink"&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</description></item><item><title>Guide to Modern Emacs Completion: vertico, corfu &amp; friends</title><link>https://jneidel.com/guide/emacs-completion/</link><pubDate>Wed, 04 Feb 2026 00:00:00 +0000</pubDate><author>web@jneidel.com (Jonathan Neidel)</author><guid>https://jneidel.com/guide/emacs-completion/</guid><description>&lt;p&gt;A good completion system can make navigating an app like walking over clouds.
A terrible one is like walking barefoot over spiky stones.
Every step of the way will hurt.
Unfortunately Emacs&amp;rsquo; defaults make for quite the thorny walk.
Fortunately that is very fixable.&lt;/p&gt;
&lt;p&gt;This guide will explain the necessary concepts and go through all of my configuration for the relevant packages of the &amp;ldquo;&lt;a href="https://github.com/minad" rel="external"&gt;minad&lt;/a&gt; stack&amp;rdquo; (vertico, consult, corfu &amp;amp; friends) and some more.
The setup is tailored toward modern sensibilities (fuzzy finding, LSP completions) and assumes you can tweak an elisp configuration to your needs.&lt;/p&gt;
&lt;h2 id="types-of-emacs-completion" class="relative group"&gt;Types of Emacs completion &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#types-of-emacs-completion" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;The most important thing to understand about auto-completion in Emacs is that there are two kinds:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Completing-read&lt;/strong&gt;: this is your minibuffer (&lt;kbd&gt;M-x&lt;/kbd&gt;), &lt;code&gt;find-file&lt;/code&gt;, and all those other functions that prompt you at the bottom of the screen.

 
 
 
 
 
 
 

 
 
 

 
 

 
 
 &lt;figure class="w-9/12 mx-auto my-0 rounded-sm"&gt;
 
 
 









 
 &lt;picture
 class="w-9/12 mx-auto my-0 rounded-sm"
 
 &gt;
 
 
 

 
 &lt;source
 
 
 srcset="https://jneidel.com/guide/emacs-completion/basic-vertico_hu_e77fa4f7322e7bcc.webp"
 
 
 sizes="100vw"
 type="image/webp"
 /&gt;
 
 &lt;img
 width="433"
 height="242"
 class="w-9/12 mx-auto my-0 rounded-sm"
 alt="Basic minibuffer completion with vertico"
 loading="lazy" decoding="async"
 
 
 src="https://jneidel.com/guide/emacs-completion/basic-vertico.png"
 
 /&gt;
 &lt;/picture&gt;
 


 
 &lt;/figure&gt;

&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Completion-at-point&lt;/strong&gt; (and completion-in-region): these complete text inside of a buffer (usually assigned to &lt;kbd&gt;TAB&lt;/kbd&gt;.)

 
 
 
 
 
 
 

 
 
 

 
 

 
 
 &lt;figure class="w-12/12 mx-auto my-0 rounded-sm"&gt;
 
 
 









 
 &lt;picture
 class="w-12/12 mx-auto my-0 rounded-sm"
 
 &gt;
 
 
 

 
 &lt;source
 
 srcset="https://jneidel.com/guide/emacs-completion/basic-corfu_hu_b44f5757bcd1129f.webp 330w,/guide/emacs-completion/basic-corfu_hu_7f85b96a9f02e92f.webp 660w
 
 ,/guide/emacs-completion/basic-corfu_hu_bf6ca6b3435d031b.webp 1024w
 
 
 ,/guide/emacs-completion/basic-corfu_hu_52557073c75ec7ae.webp 1320w
 "
 
 sizes="100vw"
 type="image/webp"
 /&gt;
 
 &lt;img
 width="1448"
 height="415"
 class="w-12/12 mx-auto my-0 rounded-sm"
 alt="Basic completion at point with vertico"
 loading="lazy" decoding="async"
 
 
 src="https://jneidel.com/guide/emacs-completion/basic-corfu_hu_2ec009f07752d7a7.png"
 srcset="https://jneidel.com/guide/emacs-completion/basic-corfu_hu_3a08b734cada60a6.png 330w,/guide/emacs-completion/basic-corfu_hu_2ec009f07752d7a7.png 660w
 
 ,/guide/emacs-completion/basic-corfu_hu_fab23c0f42c6c1ae.png 1024w
 
 
 ,/guide/emacs-completion/basic-corfu_hu_67da1a3f081dce18.png 1320w
 "
 sizes="100vw"
 
 /&gt;
 &lt;/picture&gt;
 


 
 &lt;/figure&gt;

&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;With that understood, suddenly those cryptic package headlines make more sense:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&amp;ldquo;🔍 &lt;a href="https://github.com/minad/consult" rel="external"&gt;consult.el&lt;/a&gt; - Consulting completing-read&amp;rdquo;&lt;/li&gt;
&lt;li&gt;&amp;ldquo;🏝️ &lt;a href="https://github.com/minad/corfu" rel="external"&gt;corfu.el&lt;/a&gt; - COmpletion in Region FUnction&amp;rdquo;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="completion-styles" class="relative group"&gt;Completion styles &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#completion-styles" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;&lt;a href="https://www.gnu.org/software/emacs/manual/html_node/emacs/Completion-Styles.html" rel="external"&gt;&lt;code&gt;completion-styles&lt;/code&gt;&lt;/a&gt; define the matching algorithms used.
After years of &lt;a href="https://github.com/junegunn/fzf" rel="external"&gt;fzf&lt;/a&gt; (ab)use I instinctively use spaces to separate queries for completing-read prompt (e.g. &amp;ldquo;a b&amp;rdquo;.)
This is supported by &lt;a href="https://github.com/oantolin/orderless" rel="external"&gt;orderless&lt;/a&gt;.
Default styles plus orderless and I&amp;rsquo;m content to the point that I had not felt the need to fiddle with it.&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;Configuration code for completion styles + orderless&lt;/summary&gt;
&lt;p&gt;&lt;code&gt;completion-styles&lt;/code&gt; checks for matches in order.
So go from strictest to losest.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-elisp" data-lang="elisp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;use-package&lt;/span&gt; &lt;span class="nv"&gt;orderless&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;:custom&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;orderless-matching-styles&lt;/span&gt; &lt;span class="o"&gt;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;orderless-prefixes&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;completion-ignore-case&lt;/span&gt; &lt;span class="no"&gt;t&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;:config&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;set-face-attribute&lt;/span&gt; &lt;span class="ss"&gt;&amp;#39;orderless-match-face-0&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;:foreground&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;#d70000&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;set-face-attribute&lt;/span&gt; &lt;span class="ss"&gt;&amp;#39;orderless-match-face-1&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;:foreground&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;#005fd7&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;set-face-attribute&lt;/span&gt; &lt;span class="ss"&gt;&amp;#39;orderless-match-face-2&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;:foreground&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;#007f3a&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;set-face-attribute&lt;/span&gt; &lt;span class="ss"&gt;&amp;#39;orderless-match-face-3&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;:foreground&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;#d700d7&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;setq&lt;/span&gt; &lt;span class="nv"&gt;completion-styles&lt;/span&gt; &lt;span class="o"&gt;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;basic&lt;/span&gt; &lt;span class="nf"&gt;substring&lt;/span&gt; &lt;span class="nv"&gt;initials&lt;/span&gt; &lt;span class="nv"&gt;orderless&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;completion-category-overrides&lt;/span&gt; &lt;span class="o"&gt;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nv"&gt;file&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;styles&lt;/span&gt; &lt;span class="nv"&gt;basic&lt;/span&gt; &lt;span class="nv"&gt;partial-completion&lt;/span&gt;&lt;span class="p"&gt;))))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/details&gt;
&lt;h2 id="completing-read" class="relative group"&gt;Completing-read &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#completing-read" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;I consider the configuration of the minibuffer UI critical
In my first 6 months of Emacs, the god-awful user experience of &lt;code&gt;fido-mode&lt;/code&gt; and &lt;code&gt;find-file&lt;/code&gt; really made me not want to use Emacs.
I was used to insanely fast &lt;a href="https://github.com/junegunn/fzf" rel="external"&gt;fuzzy finders&lt;/a&gt; everywhere.
Emacs&amp;rsquo; default completing-read felt like from a different century (which it is.)&lt;/p&gt;

 
 
 
 
 
 
 

 
 
 

 
 

 
 
 
 
 
 &lt;figure class="w-12/12 mx-auto my-0 rounded-sm"&gt;
 &lt;img src="./vertico-marginalia-mx.png" alt="M-x with vertico and marginalia" class="w-12/12 mx-auto my-0 rounded-sm"/&gt;
 &lt;figcaption class="text-center"&gt;Vertico + marginalia goodness.&lt;/figcaption&gt;
 &lt;/figure&gt;


&lt;p&gt;&lt;a href="https://github.com/minad/vertico" rel="external"&gt;Vertico&lt;/a&gt; is a great improvement.
&lt;a href="https://github.com/minad/marginalia" rel="external"&gt;Marginalia&lt;/a&gt; adds context.
Just that already makes for a much improved experience.
Even if you don&amp;rsquo;t like the vertical list style, &lt;a href="https://github.com/minad/vertico#extensions" rel="external"&gt;vertico got you covered&lt;/a&gt; (&lt;a href="https://www.youtube.com/watch?v=hPwDbx--Waw" rel="external"&gt;visual demo&lt;/a&gt; of the different styles by &lt;a href="https://karthinks.com" rel="external"&gt;Karthink&lt;/a&gt;.)&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;Configuration code for vertico and marginalia&lt;/summary&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-elisp" data-lang="elisp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;use-package&lt;/span&gt; &lt;span class="nv"&gt;vertico&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;:demand&lt;/span&gt; &lt;span class="no"&gt;t&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;:bind&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;:map&lt;/span&gt; &lt;span class="nv"&gt;minibuffer-local-map&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;&amp;lt;tab&amp;gt;&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="nv"&gt;vertico-next&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;&amp;lt;backtab&amp;gt;&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="nv"&gt;vertico-previous&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;:custom&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;vertico-cycle&lt;/span&gt; &lt;span class="no"&gt;t&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;; C-n at the bottom of the list loops around to the top&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;:config&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;vertico-mode&lt;/span&gt; &lt;span class="no"&gt;t&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;vertico-reverse-mode&lt;/span&gt; &lt;span class="no"&gt;t&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;; Verticos highlight font was clashing with my completion part, so adjust the font faces&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;set-face-attribute&lt;/span&gt; &lt;span class="ss"&gt;&amp;#39;vertico-current&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;:weight&lt;/span&gt; &lt;span class="ss"&gt;&amp;#39;bold&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;:inverse-video&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;:foreground&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;#ffbf00&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;:background&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;grey20&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;set-face-attribute&lt;/span&gt; &lt;span class="ss"&gt;&amp;#39;completions-common-part&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;:weight&lt;/span&gt; &lt;span class="ss"&gt;&amp;#39;bold&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;:foreground&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;#d70000&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;set-face-attribute&lt;/span&gt; &lt;span class="ss"&gt;&amp;#39;minibuffer-prompt&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;:foreground&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;#ffbf00&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;use-package&lt;/span&gt; &lt;span class="nv"&gt;marginalia&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;:custom&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;marginalia-align&lt;/span&gt; &lt;span class="ss"&gt;&amp;#39;right&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;:config&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;marginalia-mode&lt;/span&gt; &lt;span class="no"&gt;t&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;set-face-attribute&lt;/span&gt; &lt;span class="ss"&gt;&amp;#39;marginalia-documentation&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;:inherit&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;:slant&lt;/span&gt; &lt;span class="ss"&gt;&amp;#39;italic&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;:foreground&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;grey43&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;set-face-attribute&lt;/span&gt; &lt;span class="ss"&gt;&amp;#39;marginalia-key&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;:foreground&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;#00ff5f&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;For whatever reason my vertico has some indicators in the right fringe and this
is the only way (I found) to get rid of them:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-elisp" data-lang="elisp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;defun&lt;/span&gt; &lt;span class="nv"&gt;jn/vertico-hide-fringe-and-truncation-indicators&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;when&lt;/span&gt; &lt;span class="nv"&gt;vertico-mode&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;setq-local&lt;/span&gt; &lt;span class="nv"&gt;fringe-indicator-alist&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;let&lt;/span&gt; &lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nv"&gt;a&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;copy-alist&lt;/span&gt; &lt;span class="nv"&gt;fringe-indicator-alist&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;setf&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;cdr&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;assq&lt;/span&gt; &lt;span class="ss"&gt;&amp;#39;continuation&lt;/span&gt; &lt;span class="nv"&gt;a&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;setf&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;cdr&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;assq&lt;/span&gt; &lt;span class="ss"&gt;&amp;#39;truncation&lt;/span&gt; &lt;span class="nv"&gt;a&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;a&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;setq-local&lt;/span&gt; &lt;span class="nv"&gt;truncation-string&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;add-hook&lt;/span&gt; &lt;span class="ss"&gt;&amp;#39;minibuffer-setup-hook&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;#&amp;#39;&lt;/span&gt;&lt;span class="nv"&gt;jn/vertico-hide-fringe-and-truncation-indicators&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/details&gt;
&lt;p&gt;Many functions will benefit from a nice completing-read UI setup.&lt;/p&gt;
&lt;h3 id="fuzzy-file-search" class="relative group"&gt;Fuzzy file search &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#fuzzy-file-search" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h3&gt;&lt;p&gt;For 98% of my file search I use a fuzzy finder.
It gets me where I want to go quicker than traversing the directory tree.
For this I use &lt;a href="https://github.com/minad/affe" rel="external"&gt;affe&lt;/a&gt;.&lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;

 
 
 
 
 
 
 

 
 
 

 
 

 
 
 &lt;figure class="w-12/12 mx-auto my-0 rounded-sm"&gt;
 
 
 









 
 &lt;picture
 class="w-12/12 mx-auto my-0 rounded-sm"
 
 &gt;
 
 
 

 
 &lt;source
 
 srcset="https://jneidel.com/guide/emacs-completion/affe_hu_5f48b7294d9ea199.webp 330w,/guide/emacs-completion/affe_hu_ec54a46594327dca.webp 660w
 
 ,/guide/emacs-completion/affe_hu_fe6ec1ce881c02c6.webp 1024w
 
 
 ,/guide/emacs-completion/affe_hu_2ac0b295b50f9a4a.webp 1320w
 "
 
 sizes="100vw"
 type="image/webp"
 /&gt;
 
 &lt;img
 width="1415"
 height="177"
 class="w-12/12 mx-auto my-0 rounded-sm"
 alt="Fuzzy finder in Emacs with affe"
 loading="lazy" decoding="async"
 
 
 src="https://jneidel.com/guide/emacs-completion/affe_hu_22195435647c3c6.png"
 srcset="https://jneidel.com/guide/emacs-completion/affe_hu_2fa021de5cc5b60b.png 330w,/guide/emacs-completion/affe_hu_22195435647c3c6.png 660w
 
 ,/guide/emacs-completion/affe_hu_c6392649708f43f7.png 1024w
 
 
 ,/guide/emacs-completion/affe_hu_ca0bab7fcb0eb5da.png 1320w
 "
 sizes="100vw"
 
 /&gt;
 &lt;/picture&gt;
 


 &lt;figcaption class="text-center"&gt;Affe search. Permissions, sizes and dates are courtesy of marginalia.&lt;/figcaption&gt;
 &lt;/figure&gt;


&lt;p&gt;&lt;code&gt;affe-find&lt;/code&gt; only searches the current directory (or project.)
To use it for the whole system some customization is needed.
There is a reason that &lt;code&gt;affe-find&lt;/code&gt; from the home directory is not offered by the package author.
Without some cleanup you will be overwhelmed by irrelevant matches.
Though with &lt;a href="https://github.com/BurntSushi/ripgrep" rel="external"&gt;ripgrep&lt;/a&gt; as our blazing fast file finder we can exclude matches like this:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;pass a &lt;code&gt;--glob&lt;/code&gt; flag to the command, with a pattern to ignore&lt;/li&gt;
&lt;li&gt;create a &lt;code&gt;.rgignore&lt;/code&gt; with a list of files in any directory root&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;With that, the number of matched files gets reduced to an amount where search feels instant.&lt;/p&gt;
&lt;p&gt;I have these different bindings to invoke affe (ordered by frequency of use):&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Search for a file on the system&lt;/li&gt;
&lt;li&gt;Search for a file in the current project&lt;/li&gt;
&lt;li&gt;Search for a directory on the system&lt;/li&gt;
&lt;/ol&gt;
&lt;details&gt;
&lt;summary&gt;Configuration code for affe&lt;/summary&gt;
&lt;p&gt;For one-off exclusions I use local &lt;code&gt;.rgignore&lt;/code&gt; files (e.g. in &lt;code&gt;~&lt;/code&gt; and &lt;code&gt;~/.config&lt;/code&gt;.)
For file type or repeated directory exclusions I use ignore flags.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-elisp" data-lang="elisp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;defvar&lt;/span&gt; &lt;span class="nv"&gt;rg-ignore-flags&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s"&gt;&amp;#34;-g \&amp;#34;!*.mp3\&amp;#34; -g \&amp;#34;!*.jpg\&amp;#34; -g \&amp;#34;!*.JPG\&amp;#34; -g \&amp;#34;!*.jpeg\&amp;#34; -g \&amp;#34;!*.png\&amp;#34; \
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; -g \&amp;#34;!*.mkv\&amp;#34; -g \&amp;#34;!*.mp4\&amp;#34; -g \&amp;#34;!*.avi\&amp;#34; -g \&amp;#34;!*.zip\&amp;#34; -g \&amp;#34;!*.ddl\&amp;#34; \
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; -g \&amp;#34;!*.ods\&amp;#34; -g \&amp;#34;!*.xlsx\&amp;#34; -g \&amp;#34;!*.m3u\&amp;#34; -g \&amp;#34;!*.url\&amp;#34; -g \&amp;#34;!*.aac\&amp;#34; \
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; -g \&amp;#34;!*.mpc\&amp;#34; -g \&amp;#34;!*.sql\&amp;#34; -g \&amp;#34;!*.ydb\&amp;#34; -g \&amp;#34;!dist/\&amp;#34; \
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; -g \&amp;#34;!.git/\&amp;#34; -g \&amp;#34;!git/*\&amp;#34; -g \&amp;#34;!node_modules/\&amp;#34; -g \&amp;#34;!*cache/\&amp;#34; \
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; -g \&amp;#34;!.cache\&amp;#34; -g \&amp;#34;!vendor/\&amp;#34; \
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; -g \&amp;#34;!.pki/\&amp;#34; -g \&amp;#34;!.local/share/*/\&amp;#34; \
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; -g \&amp;#34;!coverage\&amp;#34; -g \&amp;#34;!build/\&amp;#34; -g \&amp;#34;!var/\&amp;#34; -g \&amp;#34;!npm/\&amp;#34; \
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; -g \&amp;#34;!Library/\&amp;#34; -g \&amp;#34;!.DS_Store\&amp;#34; -g \&amp;#34;!.stfolder\&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s"&gt;&amp;#34;Exclusion flags for usage with ripgrep commands.&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;defvar&lt;/span&gt; &lt;span class="nv"&gt;rg-find-files-command&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;format&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;rg -L --ignore --hidden --files --color=never %s&amp;#34;&lt;/span&gt; &lt;span class="nv"&gt;rg-ignore-flags&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s"&gt;&amp;#34;Command for finding files with ripgrep.&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;defvar&lt;/span&gt; &lt;span class="nv"&gt;rg-find-directories-command&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;format&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;rg-dir -L --ignore --hidden --color=never %s&amp;#34;&lt;/span&gt; &lt;span class="nv"&gt;rg-ignore-flags&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s"&gt;&amp;#34;Command for finding directories with ripgrep.&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;defun&lt;/span&gt; &lt;span class="nv"&gt;affe-find-file&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kp"&gt;&amp;amp;optional&lt;/span&gt; &lt;span class="nv"&gt;dir&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;interactive&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;; default dir is cwd&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;setq&lt;/span&gt; &lt;span class="nv"&gt;affe-find-command&lt;/span&gt; &lt;span class="nv"&gt;rg-find-files-command&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;affe-find&lt;/span&gt; &lt;span class="nv"&gt;dir&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;defun&lt;/span&gt; &lt;span class="nv"&gt;affe-find-directory&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kp"&gt;&amp;amp;optional&lt;/span&gt; &lt;span class="nv"&gt;dir&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;interactive&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;; default dir is cwd&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;setq&lt;/span&gt; &lt;span class="nv"&gt;affe-find-command&lt;/span&gt; &lt;span class="nv"&gt;rg-find-directories-command&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;affe-find&lt;/span&gt; &lt;span class="nv"&gt;dir&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;defun&lt;/span&gt; &lt;span class="nv"&gt;affe-find-file-home&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;interactive&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;affe-find-file&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;substitute-in-file-name&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;$HOME&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;defun&lt;/span&gt; &lt;span class="nv"&gt;affe-find-directory-home&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;interactive&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;affe-find-directory&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;substitute-in-file-name&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;$HOME&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;use-package&lt;/span&gt; &lt;span class="nv"&gt;affe&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;:bind&lt;/span&gt; &lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;H-f&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="nv"&gt;affe-find-file-home&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;H-M-f&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="nv"&gt;affe-find-file&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;H-s&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="nv"&gt;affe-find-directory-home&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;:custom&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;affe-count&lt;/span&gt; &lt;span class="mi"&gt;5000&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;If you want to have the &lt;kdb&gt;H&lt;/kdb&gt; (Hyper) modifier, here is &lt;a href="https://jneidel.com/dev/hyper-modifier/"&gt;how I set it up on Linux&lt;/a&gt;.&lt;/p&gt;
&lt;/details&gt;
&lt;h3 id="improved-find-file" class="relative group"&gt;Improved find-file &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#improved-find-file" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h3&gt;&lt;p&gt;I do use &lt;code&gt;find-file&lt;/code&gt; to initiate &lt;a href="https://www.gnu.org/software/tramp/" rel="external"&gt;tramp&lt;/a&gt; connections.
&lt;code&gt;find-file&lt;/code&gt;s default &lt;kbd&gt;TAB&lt;/kbd&gt; and &lt;kbd&gt;RET&lt;/kbd&gt; behaviors leave a lot to be desired.
Might be a skill issue, but I found myself always writing the path by hand for those deeply nested files.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;vertico-directory&lt;/code&gt; gives me exactly the intuitive navigation I expect:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-elisp" data-lang="elisp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;use-package&lt;/span&gt; &lt;span class="nv"&gt;vertico-directory&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;:after&lt;/span&gt; &lt;span class="nv"&gt;vertico&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;:ensure&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;:bind&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;:map&lt;/span&gt; &lt;span class="nv"&gt;vertico-map&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;RET&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="nv"&gt;vertico-directory-enter&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;DEL&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="nv"&gt;vertico-directory-delete-char&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;M-DEL&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="nv"&gt;vertico-directory-delete-word&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;:hook&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;rfn-eshadow-update-overlay&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="nv"&gt;vertico-directory-tidy&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="consult-for-better-functions" class="relative group"&gt;Consult for better functions &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#consult-for-better-functions" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h3&gt;&lt;p&gt;&lt;a href="https://github.com/minad/consult" rel="external"&gt;Consult&lt;/a&gt; offers a host of useful interactive functions built on completing-read.
Many of them are superior replacements for built-in functions.&lt;/p&gt;
&lt;p&gt;
 
 
 
 
 
 
 

 
 
 

 
 

 
 
 &lt;figure class="w-12/12 mx-auto my-0 rounded-sm"&gt;
 
 
 









 
 &lt;picture
 class="w-12/12 mx-auto my-0 rounded-sm"
 
 &gt;
 
 
 

 
 &lt;source
 
 srcset="https://jneidel.com/guide/emacs-completion/consult-line_hu_6909fc6367957ada.webp 330w,/guide/emacs-completion/consult-line_hu_c5f86b1feb3c0c2.webp 660w
 
 ,/guide/emacs-completion/consult-line_hu_e7dbdc263a5a4628.webp 1024w
 
 
 
 ,/guide/emacs-completion/consult-line_hu_aff0ba377c7f8598.webp 1201w
 
 "
 
 sizes="100vw"
 type="image/webp"
 /&gt;
 
 &lt;img
 width="1201"
 height="163"
 class="w-12/12 mx-auto my-0 rounded-sm"
 alt="Consult-line example"
 loading="lazy" decoding="async"
 
 
 src="https://jneidel.com/guide/emacs-completion/consult-line_hu_f92284c928669724.png"
 srcset="https://jneidel.com/guide/emacs-completion/consult-line_hu_cdf99f190fabbde6.png 330w,/guide/emacs-completion/consult-line_hu_f92284c928669724.png 660w
 
 ,/guide/emacs-completion/consult-line_hu_2e7bbe9ca7657e4b.png 1024w
 
 
 ,/guide/emacs-completion/consult-line.png 1201w
 "
 sizes="100vw"
 
 /&gt;
 &lt;/picture&gt;
 


 &lt;figcaption class="text-center"&gt;Fuzzy finder to select a line to jump to (with context preview.)&lt;/figcaption&gt;
 &lt;/figure&gt;


&lt;br&gt;&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;Configuration code for consult&lt;/summary&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-elisp" data-lang="elisp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;use-package&lt;/span&gt; &lt;span class="nv"&gt;consult&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;:bind&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="c1"&gt;;; new functionality&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;M-g l&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="nv"&gt;consult-line&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;M-g m&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="nv"&gt;consult-mark&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;H-r&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="nv"&gt;consult-ripgrep&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;;; replace built-in functions with superior versions&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;M-y&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="nv"&gt;consult-yank-pop&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;C-x 4 b&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="nv"&gt;consult-buffer-other-window&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;C-x t b&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="nv"&gt;consult-buffer-other-tab&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="nv"&gt;remap&lt;/span&gt; &lt;span class="nv"&gt;Info-search&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="nv"&gt;consult-info&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="nv"&gt;remap&lt;/span&gt; &lt;span class="nv"&gt;list-buffers&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="nv"&gt;ibuffer&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;If you want to have the &lt;kdb&gt;H&lt;/kdb&gt; (Hyper) modifier, here is &lt;a href="https://jneidel.com/dev/hyper-modifier/"&gt;how I set it up on Linux&lt;/a&gt;.&lt;/p&gt;
&lt;/details&gt;
&lt;p&gt;The consult interface I rely on most heavily is &lt;code&gt;consult-buffer&lt;/code&gt;.
It can be modded to achieve this:&lt;/p&gt;

 
 
 
 
 
 
 

 
 
 

 
 

 
 
 &lt;figure class="w-12/12 mx-auto my-0 rounded-sm"&gt;
 
 
 









 
 &lt;picture
 class="w-12/12 mx-auto my-0 rounded-sm"
 
 &gt;
 
 
 

 
 &lt;source
 
 srcset="https://jneidel.com/guide/emacs-completion/consult-buffer_hu_8c884e017f56a7aa.webp 330w,/guide/emacs-completion/consult-buffer_hu_f9b18d05ad6ac5b0.webp 660w
 
 ,/guide/emacs-completion/consult-buffer_hu_5e414d90436ef0ce.webp 1024w
 
 
 ,/guide/emacs-completion/consult-buffer_hu_4ab472e411b126b7.webp 1320w
 "
 
 sizes="100vw"
 type="image/webp"
 /&gt;
 
 &lt;img
 width="1920"
 height="310"
 class="w-12/12 mx-auto my-0 rounded-sm"
 alt="Consult-buffer with regular buffers and special buffers separated"
 loading="lazy" decoding="async"
 
 
 src="https://jneidel.com/guide/emacs-completion/consult-buffer_hu_ea94bf1acb1b2b49.png"
 srcset="https://jneidel.com/guide/emacs-completion/consult-buffer_hu_1add145fad66080e.png 330w,/guide/emacs-completion/consult-buffer_hu_ea94bf1acb1b2b49.png 660w
 
 ,/guide/emacs-completion/consult-buffer_hu_25fb338f5c5c997c.png 1024w
 
 
 ,/guide/emacs-completion/consult-buffer_hu_5f33cbd2aa9ae583.png 1320w
 "
 sizes="100vw"
 
 /&gt;
 &lt;/picture&gt;
 


 
 &lt;/figure&gt;


&lt;p&gt;What are we looking at?
We got multiple sections &amp;ldquo;Perspective Buffer&amp;rdquo;, &amp;ldquo;Special Buffer&amp;rdquo;, &amp;ldquo;File&amp;rdquo; and &amp;ldquo;Bookmark&amp;rdquo; off-screen.
So, we get filtering by &lt;a href="https://github.com/nex3/perspective-el" rel="external"&gt;perspective&lt;/a&gt; workspace, access to &lt;a href="https://www.emacswiki.org/emacs/RecentFiles" rel="external"&gt;recent files&lt;/a&gt; and bookmarks.
Already great.
The &amp;ldquo;Special Buffer&amp;rdquo; is where the real flexibility of this system comes in.&lt;/p&gt;
&lt;p&gt;I use &lt;a href="https://github.com/karthink/popper" rel="external"&gt;popper&lt;/a&gt; to relegate help buffers, compilation output and those sorts of buffers to a separate &amp;ldquo;popup stack&amp;rdquo;.
Some get hidden completely and the rest don&amp;rsquo;t disturb my layout and are easily hidden.
All well and good.
A popup buffer, even a suppressed one, will still show up at the top of your buffer list, as the most recently accessed.
Distracting clutter.
Well, &lt;code&gt;consult-buffer&lt;/code&gt; allows you to customize the sections.
With this I segregated popup buffer off into their own section.
Separate and not equal.&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;Configuration code for consult-buffer + popper + perspective&lt;/summary&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-elisp" data-lang="elisp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;setq&lt;/span&gt; &lt;span class="nv"&gt;jn/secondary-buffer-regexes&lt;/span&gt; &lt;span class="c1"&gt;; alist in popper format&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;\\*Messages\\*&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;\\*Warnings\\*&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="nv"&gt;hide&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s"&gt;&amp;#34;\\*Man.*&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s"&gt;&amp;#34;\\*Help.*&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s"&gt;&amp;#34;\\*helpful.*&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;\\*Compile.*&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="nv"&gt;hide&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;\\*Org-Babel Error Output\\*&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="nv"&gt;hide&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;\\*Async Shell Command\\*&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="nv"&gt;hide&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s"&gt;&amp;#34;\\*slime.*&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;\\*inferior-lisp\\*&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="nv"&gt;hide&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;\\*sldb.*&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="nv"&gt;hide&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s"&gt;&amp;#34;\\*Backtrace\\*&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s"&gt;&amp;#34;\\*org-search\\*&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s"&gt;&amp;#34;\\* Merriam-Webster&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s"&gt;&amp;#34;\\*Flymake diagnostics&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;use-package&lt;/span&gt; &lt;span class="nv"&gt;popper&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;:custom&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;popper-reference-buffers&lt;/span&gt; &lt;span class="nv"&gt;jn/secondary-buffer-regexes&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;popper-mode-line&lt;/span&gt; &lt;span class="o"&gt;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;:eval&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;popper-window-height&lt;/span&gt; &lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;; default function maxes out at 33%, which seems too small to me&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;:defer&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;:config&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;popper-mode&lt;/span&gt; &lt;span class="mi"&gt;+1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;defhydra&lt;/span&gt; &lt;span class="nv"&gt;popper-hydra&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;:hint&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s"&gt;&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;_n_ext _p_revious promo_t_e/demo_t_e show/_u_nshow&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;n&amp;#34;&lt;/span&gt; &lt;span class="nv"&gt;popper-cycle&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;p&amp;#34;&lt;/span&gt; &lt;span class="nv"&gt;popper-cycle-backwards&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;t&amp;#34;&lt;/span&gt; &lt;span class="nv"&gt;popper-toggle-type&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;u&amp;#34;&lt;/span&gt; &lt;span class="nv"&gt;popper-toggle&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;q&amp;#34;&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;C-g&amp;#34;&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;ESC&amp;#34;&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;:bind&lt;/span&gt; &lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;H-u&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="nv"&gt;popper-toggle&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;; quick show/hide popups&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;H-U&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="nv"&gt;popper-hydra/body&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;defun&lt;/span&gt; &lt;span class="nv"&gt;jn/strip-alists&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;buffers&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;mapcar&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;lambda&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;item&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;consp&lt;/span&gt; &lt;span class="nv"&gt;item&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;car&lt;/span&gt; &lt;span class="nv"&gt;item&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;item&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;buffers&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;setq&lt;/span&gt; &lt;span class="nv"&gt;jn/secondary-buffer-pure-regexes&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;jn/strip-alists&lt;/span&gt; &lt;span class="nv"&gt;jn/secondary-buffer-regexes&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="c1"&gt;; normalize into regexes&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;use-package&lt;/span&gt; &lt;span class="nv"&gt;consult&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;:custom&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;popper-group-function&lt;/span&gt; &lt;span class="nf"&gt;#&amp;#39;&lt;/span&gt;&lt;span class="nv"&gt;popper-group-by-perspective&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;:config&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;consult-customize&lt;/span&gt; &lt;span class="nv"&gt;consult-source-buffer&lt;/span&gt; &lt;span class="nb"&gt;:hidden&lt;/span&gt; &lt;span class="no"&gt;t&lt;/span&gt; &lt;span class="nb"&gt;:default&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;; disable&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;consult-customize&lt;/span&gt; &lt;span class="nv"&gt;persp-consult-source&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;:name&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;Perspective Buffer&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;:default&lt;/span&gt; &lt;span class="no"&gt;t&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;:items&lt;/span&gt; &lt;span class="o"&gt;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;lambda&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;consult--buffer-query&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;:sort&lt;/span&gt; &lt;span class="ss"&gt;&amp;#39;visibility&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;:as&lt;/span&gt; &lt;span class="nf"&gt;#&amp;#39;buffer-name&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;:predicate&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;lambda&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;buf&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;persp-is-current-buffer&lt;/span&gt; &lt;span class="nv"&gt;buf&lt;/span&gt; &lt;span class="no"&gt;t&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;:exclude&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt; &lt;span class="nv"&gt;jn/secondary-buffer-pure-regexes&lt;/span&gt; &lt;span class="o"&gt;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;^ \\*&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)))))&lt;/span&gt; &lt;span class="c1"&gt;; hidden buffers like minibuffer&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;defvar&lt;/span&gt; &lt;span class="nv"&gt;consult-special-buffer&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;`&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="nb"&gt;:name&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;Special Buffer&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;:default&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;:face&lt;/span&gt; &lt;span class="nv"&gt;consult-buffer&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;:category&lt;/span&gt; &lt;span class="nv"&gt;buffer&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;:history&lt;/span&gt; &lt;span class="nv"&gt;buffer-name-history&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;:state&lt;/span&gt; &lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="nf"&gt;#&amp;#39;&lt;/span&gt;&lt;span class="nv"&gt;consult--buffer-state&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;:items&lt;/span&gt; &lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;lambda&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;consult--buffer-query&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;:sort&lt;/span&gt; &lt;span class="ss"&gt;&amp;#39;visibility&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;:as&lt;/span&gt; &lt;span class="nf"&gt;#&amp;#39;buffer-name&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;:predicate&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;lambda&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;buf&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;persp-is-current-buffer&lt;/span&gt; &lt;span class="nv"&gt;buf&lt;/span&gt; &lt;span class="no"&gt;t&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;:include&lt;/span&gt; &lt;span class="nv"&gt;jn/secondary-buffer-pure-regexes&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;))))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;add-to-list&lt;/span&gt; &lt;span class="ss"&gt;&amp;#39;consult-buffer-sources&lt;/span&gt; &lt;span class="nv"&gt;consult-special-buffer&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;add-to-list&lt;/span&gt; &lt;span class="ss"&gt;&amp;#39;consult-buffer-sources&lt;/span&gt; &lt;span class="nv"&gt;persp-consult-source&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;consult-customize&lt;/span&gt; &lt;span class="nv"&gt;consult-source-bookmark&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;:enabled&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;lambda&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;equal&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;persp-current-name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;main&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;consult-customize&lt;/span&gt; &lt;span class="nv"&gt;consult-source-recent-file&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;:enabled&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;lambda&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;equal&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;persp-current-name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;main&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/details&gt;
&lt;h3 id="in-your-own-scripts" class="relative group"&gt;In your own scripts &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#in-your-own-scripts" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h3&gt;&lt;p&gt;&lt;code&gt;completing-read&lt;/code&gt; can be powerfully used in your own elisp scripts, as demonstrated by &lt;a href="https://xenodium.com/bending-emacs-episode-8-completing-read" rel="external"&gt;Álvaro Ramírez&lt;/a&gt;.
I use it all the time.
Here to pick a type from a pool of candidates:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-elisp" data-lang="elisp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;completing-read&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;What type? &amp;#34;&lt;/span&gt; &lt;span class="o"&gt;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Project&amp;#34;&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;Design&amp;#34;&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;Resource&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt; &lt;span class="no"&gt;t&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;You can reach for &lt;a href="https://github.com/charmbracelet/gum" rel="external"&gt;gum&lt;/a&gt; if you want a similarly nice experience in your shell scripts.&lt;/p&gt;
&lt;h2 id="in-buffer-completion" class="relative group"&gt;In-buffer completion &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#in-buffer-completion" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;I use &lt;a href="https://github.com/minad/corfu" rel="external"&gt;corfu&lt;/a&gt; as my completion-at-point UI.
I would recommend it over company, because corfu uses the built-in completion API (company implements it&amp;rsquo;s own API incompatible to Emacs&amp;rsquo;.)
Even if a you depend on a package that only provides a company-backend, &lt;a href="https://github.com/minad/cape?tab=readme-ov-file#company-adapter" rel="external"&gt;corfu got you covered&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Since corfu enhances the built-in API, it will just work out of the box for modes that bring their own capfs (completion at point functions.)
Like account completion in &lt;a href="https://github.com/ledger/ledger-mode" rel="external"&gt;ledger-mode&lt;/a&gt;:

 
 
 
 
 
 
 

 
 
 

 
 

 
 
 &lt;figure class="w-12/12 mx-auto my-0 rounded-sm"&gt;
 
 
 









 
 &lt;picture
 class="w-12/12 mx-auto my-0 rounded-sm"
 
 &gt;
 
 
 

 
 &lt;source
 
 srcset="https://jneidel.com/guide/emacs-completion/corfu-ledger_hu_f03e97d655b6972.webp 330w,/guide/emacs-completion/corfu-ledger_hu_9e8f65b65a788441.webp 660w
 
 
 ,/guide/emacs-completion/corfu-ledger_hu_58438f14a800d498.webp 846w
 
 
 
 
 ,/guide/emacs-completion/corfu-ledger_hu_58438f14a800d498.webp 846w
 
 "
 
 sizes="100vw"
 type="image/webp"
 /&gt;
 
 &lt;img
 width="846"
 height="443"
 class="w-12/12 mx-auto my-0 rounded-sm"
 alt="Corfu UI in ledger-mode"
 loading="lazy" decoding="async"
 
 
 src="https://jneidel.com/guide/emacs-completion/corfu-ledger_hu_35620f64ff2cc0f4.png"
 srcset="https://jneidel.com/guide/emacs-completion/corfu-ledger_hu_3050491c3d527cd9.png 330w,/guide/emacs-completion/corfu-ledger_hu_35620f64ff2cc0f4.png 660w
 
 ,/guide/emacs-completion/corfu-ledger.png 846w
 
 
 ,/guide/emacs-completion/corfu-ledger.png 846w
 "
 sizes="100vw"
 
 /&gt;
 &lt;/picture&gt;
 


 &lt;figcaption class="text-center"&gt;Completion at point with corfu. (Error overlay by &lt;a href="https://github.com/DamienCassou/flymake-hledger" rel="external"&gt;flymake-hledger&lt;/a&gt;.)&lt;/figcaption&gt;
 &lt;/figure&gt;

&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;Configuration code for corfu&lt;/summary&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-elisp" data-lang="elisp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;;; TAB key: fix indentation if needed, otherwise perform completion&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;setq&lt;/span&gt; &lt;span class="nv"&gt;tab-always-indent&lt;/span&gt; &lt;span class="ss"&gt;&amp;#39;complete&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;use-package&lt;/span&gt; &lt;span class="nv"&gt;corfu&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;:hook&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;after-init&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="nv"&gt;global-corfu-mode&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;:custom&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;corfu-cycle&lt;/span&gt; &lt;span class="no"&gt;t&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;; cycle around to first entry after reaching the last&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;corfu-preview-current&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;; don&amp;#39;t expand text at point until I press return&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;corfu-min-width&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;corfu-on-exact-match&lt;/span&gt; &lt;span class="ss"&gt;&amp;#39;insert&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;; complete if there is only a single candidate&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;corfu-quit-no-match&lt;/span&gt; &lt;span class="no"&gt;t&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;corfu-quit-at-boundary&lt;/span&gt; &lt;span class="no"&gt;t&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;:config&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;setq&lt;/span&gt; &lt;span class="nv"&gt;corfu-popupinfo-delay&lt;/span&gt; &lt;span class="o"&gt;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;1.25&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="mf"&gt;0.5&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;corfu-popupinfo-mode&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;; shows documentation next to completions&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;;; sort by input history&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;with-eval-after-load&lt;/span&gt; &lt;span class="ss"&gt;&amp;#39;savehist&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;corfu-history-mode&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;add-to-list&lt;/span&gt; &lt;span class="ss"&gt;&amp;#39;savehist-additional-variables&lt;/span&gt; &lt;span class="ss"&gt;&amp;#39;corfu-history&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/details&gt;
&lt;h3 id="add-more-capfs" class="relative group"&gt;Add more capfs &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#add-more-capfs" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h3&gt;&lt;p&gt;With &lt;a href="https://github.com/minad/cape" rel="external"&gt;cape&lt;/a&gt; we can easily add further completion sources (completion at point functions) to be used by corfu.
I use: words in the buffer and file system paths.&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;Configuration code for cape&lt;/summary&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-elisp" data-lang="elisp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;use-package&lt;/span&gt; &lt;span class="nv"&gt;cape&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;:defer&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;:config&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;add-hook&lt;/span&gt; &lt;span class="ss"&gt;&amp;#39;completion-at-point-functions&lt;/span&gt; &lt;span class="nf"&gt;#&amp;#39;&lt;/span&gt;&lt;span class="nv"&gt;cape-dabbrev&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;; words from buffer&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;add-hook&lt;/span&gt; &lt;span class="ss"&gt;&amp;#39;completion-at-point-functions&lt;/span&gt; &lt;span class="nf"&gt;#&amp;#39;&lt;/span&gt;&lt;span class="nv"&gt;cape-file&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/details&gt;
&lt;h3 id="code-completion" class="relative group"&gt;Code completion &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#code-completion" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h3&gt;&lt;p&gt;Thanks to language servers (see &lt;a href="https://lambdaland.org/posts/2026-01-21_tree-sitter_vs_lsp/" rel="external"&gt;LSP explainer&lt;/a&gt;), nice auto-completion for code is now easy to achieve consistently.&lt;/p&gt;

 
 
 
 
 
 
 

 
 
 

 
 

 
 
 &lt;figure class="w-12/12 mx-auto my-0 rounded-sm"&gt;
 
 
 









 
 &lt;picture
 class="w-12/12 mx-auto my-0 rounded-sm"
 
 &gt;
 
 
 

 
 &lt;source
 
 srcset="https://jneidel.com/guide/emacs-completion/corfu-lsp_hu_65abf5201501dd5e.webp 330w,/guide/emacs-completion/corfu-lsp_hu_8430fcf5a3b30f7b.webp 660w
 
 ,/guide/emacs-completion/corfu-lsp_hu_d409a940fd6f514.webp 1024w
 
 
 ,/guide/emacs-completion/corfu-lsp_hu_92cffe273fde7377.webp 1320w
 "
 
 sizes="100vw"
 type="image/webp"
 /&gt;
 
 &lt;img
 width="1369"
 height="418"
 class="w-12/12 mx-auto my-0 rounded-sm"
 alt="Corfu UI in js-mode with LSP and kind-icon"
 loading="lazy" decoding="async"
 
 
 src="https://jneidel.com/guide/emacs-completion/corfu-lsp_hu_a2ce6e7fae7dbe68.png"
 srcset="https://jneidel.com/guide/emacs-completion/corfu-lsp_hu_870121a79b96d566.png 330w,/guide/emacs-completion/corfu-lsp_hu_a2ce6e7fae7dbe68.png 660w
 
 ,/guide/emacs-completion/corfu-lsp_hu_d726cd7204b13661.png 1024w
 
 
 ,/guide/emacs-completion/corfu-lsp_hu_939c9b62db35984f.png 1320w
 "
 sizes="100vw"
 
 /&gt;
 &lt;/picture&gt;
 


 &lt;figcaption class="text-center"&gt;Completion on a string in JavaScript.&lt;/figcaption&gt;
 &lt;/figure&gt;


&lt;p&gt;The icons in the UI are added by &lt;a href="https://github.com/jdtsmith/kind-icon" rel="external"&gt;kind-icon&lt;/a&gt;.&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;Configuration code for eglot and kind-icon&lt;/summary&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-elisp" data-lang="elisp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;use-package&lt;/span&gt; &lt;span class="nv"&gt;eglot&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;:ensure&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;:functions&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;eglot-ensure&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;:commands&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;eglot&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;:hook&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;prog-mode&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="nv"&gt;eglot-ensure&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;:config&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;set-face-attribute&lt;/span&gt; &lt;span class="ss"&gt;&amp;#39;eglot-highlight-symbol-face&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;:foreground&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;#ffd700&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;:underline&lt;/span&gt; &lt;span class="no"&gt;t&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;use-package&lt;/span&gt; &lt;span class="nv"&gt;kind-icon&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;:after&lt;/span&gt; &lt;span class="nv"&gt;corfu&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;:config&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;add-to-list&lt;/span&gt; &lt;span class="ss"&gt;&amp;#39;corfu-margin-formatters&lt;/span&gt; &lt;span class="nf"&gt;#&amp;#39;&lt;/span&gt;&lt;span class="nv"&gt;kind-icon-margin-formatter&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;;; fix overly large icons (https://github.com/jdtsmith/kind-icon/issues/22)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;setq&lt;/span&gt; &lt;span class="nv"&gt;kind-icon-default-style&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;:padding&lt;/span&gt; &lt;span class="mi"&gt;-1&lt;/span&gt; &lt;span class="nb"&gt;:stroke&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="nb"&gt;:margin&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="nb"&gt;:radius&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="nb"&gt;:height&lt;/span&gt; &lt;span class="mf"&gt;0.4&lt;/span&gt; &lt;span class="nb"&gt;:scale&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/details&gt;
&lt;h4 id="github-copilot" class="relative group"&gt;GitHub Copilot &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#github-copilot" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h4&gt;&lt;p&gt;&lt;a href="https://github.com/features/copilot" rel="external"&gt;GitHub Copilot&lt;/a&gt; can be used as an evolved auto-completion.
It not only completes the &amp;ldquo;word&amp;rdquo; at hand, but &amp;ldquo;finishes the whole thought.&amp;rdquo;
Often it does what you want.
Faster than you could ever type it.&lt;/p&gt;
&lt;p&gt;If you got free access, it is worth to trying, to see if it fits your development style.
That is if you are a are a &lt;a href="https://education.github.com/pack" rel="external"&gt;student&lt;/a&gt; or your employer pays for it.&lt;/p&gt;
&lt;p&gt;For me was not a good fit.
I always turned it off and never turned it on again.
I felt it constantly interrupted my thought.
Imagine you get a proposal before you even had time to think about what the piece of code should do.
You have no basis to evaluate it on, since you don&amp;rsquo;t know what you want.
And at that point the proposal influences what you think is best.
I much prefer the agentic coding loop: I think, write it down as specs/idea, pass it to the agent and only, have it work and only then see the generated code.&lt;/p&gt;
&lt;h2 id="conclusions" class="relative group"&gt;Conclusions &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#conclusions" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;Hopefully this guide gave you all the hints to successfully set up a feature-complete completions system that meets your needs.
Most of the linked packages have great documentation, if you should run into problems.&lt;/p&gt;
&lt;p&gt;For more from me, feel free to subscribe to one of the &lt;a href="https://jneidel.com/rss/"&gt;RSS feeds&lt;/a&gt;. &lt;br&gt;
For corrections or suggestions on this article, please &lt;a href="mailto:web-emacs-completion@jneidel.com" rel="external"&gt;email me&lt;/a&gt;🙂&lt;/p&gt;
&lt;p&gt;Have a great day!&lt;/p&gt;
&lt;h2 id="references" class="relative group"&gt;References &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#references" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;This is an entry for the &lt;a href="https://www.emacswiki.org/emacs/Carnival" rel="external"&gt;Emacs Carnival&lt;/a&gt;.
See other contributions on the topic of &lt;a href="https://sachachua.com/blog/2026/01/emacs-carnival-february-2026-completion/" rel="external"&gt;completion&lt;/a&gt;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;My complete &lt;a href="https://github.com/jneidel/dotfiles/blob/master/.emacs.d/dotemacs.org" rel="external"&gt;literate config&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Protesilaos &lt;a href="https://protesilaos.com/emacs/dotemacs#h:15edf2c3-4419-4101-928a-6e224958a741" rel="external"&gt;literate config&lt;/a&gt; (completions section)&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="footnotes" role="doc-endnotes"&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id="fn:1"&gt;
&lt;p&gt;I tried &lt;a href="https://github.com/bling/fzf.el" rel="external"&gt;fzf.el&lt;/a&gt;, but it does not play along well with the rest of Emacs.
Affe on the other hand integrates seamlessly.&amp;#160;&lt;a href="#fnref:1" class="footnote-backref" role="doc-backlink"&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</description></item><item><title>Window management on MacOS with AeroSpace</title><link>https://jneidel.com/guide/aerospace-window-management/</link><pubDate>Thu, 15 Jan 2026 00:00:00 +0000</pubDate><author>web@jneidel.com (Jonathan Neidel)</author><guid>https://jneidel.com/guide/aerospace-window-management/</guid><description>&lt;p&gt;On Linux I&amp;rsquo;ve had a nice way to manage my windows for a long time now.
On my work computer, a Macbook, I was using the inadequate built-in &amp;ldquo;Spaces&amp;rdquo; feature.
An unsatisfying experience for to a lack of consistency and sane keyboard controls.
This is where &lt;a href="https://nikitabobko.github.io/AeroSpace/guide" rel="external"&gt;AeroSpace&lt;/a&gt; comes in, providing a nicer window management experience than what Apple offers.&lt;/p&gt;
&lt;p&gt;Before we setup the app, let&amp;rsquo;s take a deeper look at the problem it solves first.&lt;/p&gt;
&lt;h2 id="what-is-window-management" class="relative group"&gt;What is window management? &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#what-is-window-management" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;On a computer there are multiple application windows open at the same time.
In my case, at a minimum I always have a browser, Emacs, terminal and signal messaging client open.
Window management is what you do when you select an application window, move another out of the way or arrange multiple one the screen together.
This can be done more or less effectively.&lt;/p&gt;
&lt;p&gt;While everyone know the application window, the concept of the workspace is both unfamiliar and underutilized by most people.
Instead of cramming every open window into one workspace, layering them on top of each other or constantly minimizing them, one can split them up among many workspaces.&lt;/p&gt;
&lt;p&gt;For example, the below shows that I have two programs open in fullscreen, at the same time, each on a separate workspaces.
&lt;div class="flex flex-row justify-center items-start gap-2 [&amp;&gt;*]:min-w-0
 "&gt;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 &lt;figure class=" mx-auto my-0 rounded-sm"&gt;
 
 
 
 
 
 
 
 
 
 
 
 
 
 &lt;picture
 class=" mx-auto my-0 rounded-sm"
 
 &gt;
 
 
 
 
 
 &lt;source
 
 srcset="https://jneidel.com/guide/aerospace-window-management/demo-1_hu_90f9398efa830ae3.webp 330w,/guide/aerospace-window-management/demo-1_hu_85fcd4f5b00fe34b.webp 660w
 
 ,/guide/aerospace-window-management/demo-1_hu_b9652b7ad2d663f8.webp 1024w
 
 
 ,/guide/aerospace-window-management/demo-1_hu_fa2ba765c1c0bb18.webp 1320w
 "
 
 sizes="100vw"
 type="image/webp"
 /&gt;
 
 &lt;img
 width="3584"
 height="2240"
 class=" mx-auto my-0 rounded-sm"
 alt="Fullscreen browser"
 loading="lazy" decoding="async"
 
 
 src="https://jneidel.com/guide/aerospace-window-management/demo-1_hu_afbd712e71defc1a.png"
 srcset="https://jneidel.com/guide/aerospace-window-management/demo-1_hu_e4b42310b08c2508.png 330w,/guide/aerospace-window-management/demo-1_hu_afbd712e71defc1a.png 660w
 
 ,/guide/aerospace-window-management/demo-1_hu_4202ea18acb60755.png 1024w
 
 
 ,/guide/aerospace-window-management/demo-1_hu_39175cee5f10907b.png 1320w
 "
 sizes="100vw"
 
 /&gt;
 &lt;/picture&gt;
 
 
 
 &lt;figcaption class="text-center"&gt;Workspace 2: the browser&lt;/figcaption&gt;
 &lt;/figure&gt;
 

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 &lt;figure class=" mx-auto my-0 rounded-sm"&gt;
 
 
 
 
 
 
 
 
 
 
 
 
 
 &lt;picture
 class=" mx-auto my-0 rounded-sm"
 
 &gt;
 
 
 
 
 
 &lt;source
 
 srcset="https://jneidel.com/guide/aerospace-window-management/demo-4_hu_2cffb709c65bdf4c.webp 330w,/guide/aerospace-window-management/demo-4_hu_4856a575ab0c208f.webp 660w
 
 ,/guide/aerospace-window-management/demo-4_hu_94e0db489da28c76.webp 1024w
 
 
 ,/guide/aerospace-window-management/demo-4_hu_f21c5729ba4f7962.webp 1320w
 "
 
 sizes="100vw"
 type="image/webp"
 /&gt;
 
 &lt;img
 width="3584"
 height="2240"
 class=" mx-auto my-0 rounded-sm"
 alt="Fullscreen mail program"
 loading="lazy" decoding="async"
 
 
 src="https://jneidel.com/guide/aerospace-window-management/demo-4_hu_a5b29576d6d0d130.png"
 srcset="https://jneidel.com/guide/aerospace-window-management/demo-4_hu_ddd051c3e80b6a27.png 330w,/guide/aerospace-window-management/demo-4_hu_a5b29576d6d0d130.png 660w
 
 ,/guide/aerospace-window-management/demo-4_hu_7fa4f297d3dd722.png 1024w
 
 
 ,/guide/aerospace-window-management/demo-4_hu_c15153e492d0a741.png 1320w
 "
 sizes="100vw"
 
 /&gt;
 &lt;/picture&gt;
 
 
 
 &lt;figcaption class="text-center"&gt;Workspace 5: the mail client&lt;/figcaption&gt;
 &lt;/figure&gt;
 


&lt;/div&gt;
&lt;/p&gt;
&lt;p&gt;Instead of switching between programs, I would switch between workspaces.
The advantage is that workspaces can contain arrangements of windows that can be switched between just as easily.
You can also think of workspaces in terms of function (browser) instead of program (chromium, firefox, safari, etc.)&lt;/p&gt;
&lt;p&gt;(Workspaces do not require AeroSpace and can also be utilized with the native MacOS Spaces.)&lt;/p&gt;
&lt;h2 id="why-bother-with-this" class="relative group"&gt;Why bother with this? &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#why-bother-with-this" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;Using the mouse is a user friendly and easily understandable way of selecting a
window, moving it somewhere or making it bigger.
But it is not very efficient, automatable or reproducible.&lt;/p&gt;
&lt;p&gt;Using a keyboard driven approach has all of those advantages after you got used
to the few basic keybindings.
It&amp;rsquo;s more efficient because you can perform one or many keypresses much faster, your hand does not need to leave the keyboard.
It&amp;rsquo;s automatable because you don&amp;rsquo;t need to think. You get to your browser on muscle-memory alone.
(AeroSpace additionally provides rules for automation.)
You get a sane reproducible window management because everything is always where you expect it.&lt;/p&gt;
&lt;p&gt;Window management is simply a part of every computer users life.
Might as well make it as pleasant and fluid as possible, since you use
it literally all the time.&lt;/p&gt;
&lt;p&gt;To see every app in fullscreen eliminates distractions.
There is nothing else on the screen.
The same is true for the consistency and muscle-memory.
I don&amp;rsquo;t have to think about the computer interface and can fully focus on what I&amp;rsquo;m doing.&lt;/p&gt;
&lt;h2 id="aerospace" class="relative group"&gt;AeroSpace &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#aerospace" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;On Linux there exists the distinction between Windows and MacOS style
mouse-driven &amp;ldquo;Desktop Environments&amp;rdquo; and keyboard-driven &amp;ldquo;Window Managers&amp;rdquo;.
Usage of one of the many available window managers makes for a stellar native
experience.
On MacOS using &amp;ldquo;advanced&amp;rdquo; keyboard-driven window management was not intended by Apple and
is provided by one of multiple third-party packages that hacked it in.
This carries some unfortunate and unavoidable negative performance implications.&lt;/p&gt;
&lt;p&gt;I chose &lt;a href="https://nikitabobko.github.io/AeroSpace/guide" rel="external"&gt;AeroSpace&lt;/a&gt; as my window management solution.
It fulfills my needs and provided me with a close equivalent to what is used on my Linux machine (i3.)&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;Why not use MacOS Spaces?&lt;/summary&gt;
&lt;p&gt;It&amp;rsquo;s what I used prior.
While the experience is more polished, there are several flaws which make their usage frustrating.
Among their several shortcomings are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Fixed keybindings and the defaults use the unergonomic arrow keys.&lt;/li&gt;
&lt;li&gt;Workspaces are inconsistent. Fullscreening an app messes up the order. Workspace two will not always contain the same thing.&lt;/li&gt;
&lt;li&gt;Lack of features like splits, stack, move to workspace, all readily accessible via keybinds.&lt;/li&gt;
&lt;li&gt;Switching comes with an unavoidable animation. I want instant switching and that is just not possible.&lt;/li&gt;
&lt;li&gt;Lack of automation as described above.&lt;/li&gt;
&lt;/ul&gt;
&lt;/details&gt;
&lt;h3 id="demo" class="relative group"&gt;Demo &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#demo" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h3&gt;&lt;p&gt;Here is my 2nd workspace, which is dedicated to the browser.&lt;/p&gt;

 
 
 
 
 
 
 

 
 
 

 
 

 
 
 &lt;figure class=" mx-auto my-0 rounded-sm"&gt;
 
 
 









 
 &lt;picture
 class=" mx-auto my-0 rounded-sm"
 
 &gt;
 
 
 

 
 &lt;source
 
 srcset="https://jneidel.com/guide/aerospace-window-management/demo-1_hu_90f9398efa830ae3.webp 330w,/guide/aerospace-window-management/demo-1_hu_85fcd4f5b00fe34b.webp 660w
 
 ,/guide/aerospace-window-management/demo-1_hu_b9652b7ad2d663f8.webp 1024w
 
 
 ,/guide/aerospace-window-management/demo-1_hu_fa2ba765c1c0bb18.webp 1320w
 "
 
 sizes="100vw"
 type="image/webp"
 /&gt;
 
 &lt;img
 width="3584"
 height="2240"
 class=" mx-auto my-0 rounded-sm"
 alt="Fullscreen browser"
 loading="lazy" decoding="async"
 
 
 src="https://jneidel.com/guide/aerospace-window-management/demo-1_hu_afbd712e71defc1a.png"
 srcset="https://jneidel.com/guide/aerospace-window-management/demo-1_hu_e4b42310b08c2508.png 330w,/guide/aerospace-window-management/demo-1_hu_afbd712e71defc1a.png 660w
 
 ,/guide/aerospace-window-management/demo-1_hu_4202ea18acb60755.png 1024w
 
 
 ,/guide/aerospace-window-management/demo-1_hu_39175cee5f10907b.png 1320w
 "
 sizes="100vw"
 
 /&gt;
 &lt;/picture&gt;
 


 
 &lt;/figure&gt;


&lt;p&gt;I like only having one app (and window) open per workspace.
It&amp;rsquo;s the least distracting arrangement and any app I need is only a short keypress away.&lt;/p&gt;
&lt;p&gt;For the rare case that I need it, split screen windows are of course available.
The window resizing happens automatically, as soon as I open a new browser window.
(Vertical/horizontal splits can be toggled with &lt;kbd&gt;option+e&lt;/kbd&gt;.)&lt;/p&gt;

 
 
 
 
 
 
 

 
 
 

 
 

 
 
 &lt;figure class=" mx-auto my-0 rounded-sm"&gt;
 
 
 









 
 &lt;picture
 class=" mx-auto my-0 rounded-sm"
 
 &gt;
 
 
 

 
 &lt;source
 
 srcset="https://jneidel.com/guide/aerospace-window-management/demo-2_hu_30a50b3c527d0c0.webp 330w,/guide/aerospace-window-management/demo-2_hu_417a9bc7932ff346.webp 660w
 
 ,/guide/aerospace-window-management/demo-2_hu_8174194868e8d53a.webp 1024w
 
 
 ,/guide/aerospace-window-management/demo-2_hu_40fb5c3a7e824e8a.webp 1320w
 "
 
 sizes="100vw"
 type="image/webp"
 /&gt;
 
 &lt;img
 width="3584"
 height="2240"
 class=" mx-auto my-0 rounded-sm"
 alt="Split screen browser"
 loading="lazy" decoding="async"
 
 
 src="https://jneidel.com/guide/aerospace-window-management/demo-2_hu_5544eb96a9011f0d.png"
 srcset="https://jneidel.com/guide/aerospace-window-management/demo-2_hu_f246bc7503bec0bb.png 330w,/guide/aerospace-window-management/demo-2_hu_5544eb96a9011f0d.png 660w
 
 ,/guide/aerospace-window-management/demo-2_hu_94e8842355222e26.png 1024w
 
 
 ,/guide/aerospace-window-management/demo-2_hu_75bacfdab51de751.png 1320w
 "
 sizes="100vw"
 
 /&gt;
 &lt;/picture&gt;
 


 
 &lt;/figure&gt;


&lt;p&gt;If we still want to keep both windows in the same workspace and have them be in fullscreen, we can switch to the
stacked (&lt;kbd&gt;option+s&lt;/kbd&gt;) layout.&lt;/p&gt;

 
 
 
 
 
 
 

 
 
 

 
 

 
 
 &lt;figure class=" mx-auto my-0 rounded-sm"&gt;
 
 
 









 
 &lt;picture
 class=" mx-auto my-0 rounded-sm"
 
 &gt;
 
 
 

 
 &lt;source
 
 srcset="https://jneidel.com/guide/aerospace-window-management/demo-3_hu_a32382cc337cce74.webp 330w,/guide/aerospace-window-management/demo-3_hu_2fdee4d2a2d4e81.webp 660w
 
 ,/guide/aerospace-window-management/demo-3_hu_9b6634eed3f07e24.webp 1024w
 
 
 ,/guide/aerospace-window-management/demo-3_hu_1e8820e125003781.webp 1320w
 "
 
 sizes="100vw"
 type="image/webp"
 /&gt;
 
 &lt;img
 width="3584"
 height="2240"
 class=" mx-auto my-0 rounded-sm"
 alt="Stacked AeroSpace layout"
 loading="lazy" decoding="async"
 
 
 src="https://jneidel.com/guide/aerospace-window-management/demo-3_hu_b3a5be9385e08b3c.png"
 srcset="https://jneidel.com/guide/aerospace-window-management/demo-3_hu_7c2481f80ec03294.png 330w,/guide/aerospace-window-management/demo-3_hu_b3a5be9385e08b3c.png 660w
 
 ,/guide/aerospace-window-management/demo-3_hu_f62d5df7584eee43.png 1024w
 
 
 ,/guide/aerospace-window-management/demo-3_hu_7f79369833fae7ce.png 1320w
 "
 sizes="100vw"
 
 /&gt;
 &lt;/picture&gt;
 


 
 &lt;/figure&gt;


&lt;p&gt;(Return back to the split layout anytime with &lt;kbd&gt;option+e&lt;/kbd&gt;.)&lt;/p&gt;
&lt;p&gt;In workspace 5 I have my mail.
To switch to over I simply press &lt;kbd&gt;option+5&lt;/kbd&gt;.&lt;/p&gt;

 
 
 
 
 
 
 

 
 
 

 
 

 
 
 &lt;figure class=" mx-auto my-0 rounded-sm"&gt;
 
 
 









 
 &lt;picture
 class=" mx-auto my-0 rounded-sm"
 
 &gt;
 
 
 

 
 &lt;source
 
 srcset="https://jneidel.com/guide/aerospace-window-management/demo-4_hu_2cffb709c65bdf4c.webp 330w,/guide/aerospace-window-management/demo-4_hu_4856a575ab0c208f.webp 660w
 
 ,/guide/aerospace-window-management/demo-4_hu_94e0db489da28c76.webp 1024w
 
 
 ,/guide/aerospace-window-management/demo-4_hu_f21c5729ba4f7962.webp 1320w
 "
 
 sizes="100vw"
 type="image/webp"
 /&gt;
 
 &lt;img
 width="3584"
 height="2240"
 class=" mx-auto my-0 rounded-sm"
 alt="Fullscreen mail client"
 loading="lazy" decoding="async"
 
 
 src="https://jneidel.com/guide/aerospace-window-management/demo-4_hu_a5b29576d6d0d130.png"
 srcset="https://jneidel.com/guide/aerospace-window-management/demo-4_hu_ddd051c3e80b6a27.png 330w,/guide/aerospace-window-management/demo-4_hu_a5b29576d6d0d130.png 660w
 
 ,/guide/aerospace-window-management/demo-4_hu_7fa4f297d3dd722.png 1024w
 
 
 ,/guide/aerospace-window-management/demo-4_hu_c15153e492d0a741.png 1320w
 "
 sizes="100vw"
 
 /&gt;
 &lt;/picture&gt;
 


 
 &lt;/figure&gt;


&lt;p&gt;Let&amp;rsquo;s say I want to view my email program and browser side by side.
I can easily move the mails over to workspace 2 with &lt;kbd&gt;option+shift+2&lt;/kbd&gt; and then switch
to that workspace with &lt;kbd&gt;option+2&lt;/kbd&gt;.&lt;/p&gt;

 
 
 
 
 
 
 

 
 
 

 
 

 
 
 &lt;figure class=" mx-auto my-0 rounded-sm"&gt;
 
 
 









 
 &lt;picture
 class=" mx-auto my-0 rounded-sm"
 
 &gt;
 
 
 

 
 &lt;source
 
 srcset="https://jneidel.com/guide/aerospace-window-management/demo-5_hu_5f182b55c8443109.webp 330w,/guide/aerospace-window-management/demo-5_hu_314acac15560896e.webp 660w
 
 ,/guide/aerospace-window-management/demo-5_hu_b683e07eb4fd591b.webp 1024w
 
 
 ,/guide/aerospace-window-management/demo-5_hu_602c3943c03f92a1.webp 1320w
 "
 
 sizes="100vw"
 type="image/webp"
 /&gt;
 
 &lt;img
 width="3584"
 height="2240"
 class=" mx-auto my-0 rounded-sm"
 alt="Both mail and browser together"
 loading="lazy" decoding="async"
 
 
 src="https://jneidel.com/guide/aerospace-window-management/demo-5_hu_aa8360904aab3b94.png"
 srcset="https://jneidel.com/guide/aerospace-window-management/demo-5_hu_22bdb6b36e041a2a.png 330w,/guide/aerospace-window-management/demo-5_hu_aa8360904aab3b94.png 660w
 
 ,/guide/aerospace-window-management/demo-5_hu_ca0a85fde4ae1c2.png 1024w
 
 
 ,/guide/aerospace-window-management/demo-5_hu_ad04aa20ad8ccc6d.png 1320w
 "
 sizes="100vw"
 
 /&gt;
 &lt;/picture&gt;
 


 
 &lt;/figure&gt;


&lt;p&gt;To switch from one window to the other I use &lt;kbd&gt;option+j&lt;/kbd&gt; and I can change the order with &lt;kbd&gt;option+shift+j&lt;/kbd&gt;.
(&lt;kbd&gt;j/k&lt;/kbd&gt; are up down, &lt;kbd&gt;h/l&lt;/kbd&gt; are left right. If unintuitive, this is easily configurable.)&lt;/p&gt;
&lt;p&gt;To resize use &lt;kbd&gt;option+r&lt;/kbd&gt;.&lt;/p&gt;

 
 
 
 
 
 
 

 
 
 

 
 

 
 
 &lt;figure class=" mx-auto my-0 rounded-sm"&gt;
 
 
 









 
 &lt;picture
 class=" mx-auto my-0 rounded-sm"
 
 &gt;
 
 
 

 
 &lt;source
 
 srcset="https://jneidel.com/guide/aerospace-window-management/demo-6_hu_d7ac1748ba689a38.webp 330w,/guide/aerospace-window-management/demo-6_hu_fc3b383a1fdf5fc3.webp 660w
 
 ,/guide/aerospace-window-management/demo-6_hu_b8bb9cd3ff19f176.webp 1024w
 
 
 ,/guide/aerospace-window-management/demo-6_hu_f60c5d63162ba5bc.webp 1320w
 "
 
 sizes="100vw"
 type="image/webp"
 /&gt;
 
 &lt;img
 width="3584"
 height="2240"
 class=" mx-auto my-0 rounded-sm"
 alt="Resized mail and browser together"
 loading="lazy" decoding="async"
 
 
 src="https://jneidel.com/guide/aerospace-window-management/demo-6_hu_973de0121d449b17.png"
 srcset="https://jneidel.com/guide/aerospace-window-management/demo-6_hu_ed71ee2427c77b09.png 330w,/guide/aerospace-window-management/demo-6_hu_973de0121d449b17.png 660w
 
 ,/guide/aerospace-window-management/demo-6_hu_e2caceca77b01a93.png 1024w
 
 
 ,/guide/aerospace-window-management/demo-6_hu_d8af158fbea0d2bd.png 1320w
 "
 sizes="100vw"
 
 /&gt;
 &lt;/picture&gt;
 


 
 &lt;/figure&gt;


&lt;p&gt;All of these keybindings are arbitrary and just what I use.
They can be changed to your liking.
You could use another prefix (instead of &lt;kbd&gt;option&lt;/kbd&gt;.)
You could use mnemonic workspace keys instead of 1..10, like b=browser,
t=terminal, m=mail, e=Emacs, etc.
Choose what fits you.&lt;/p&gt;
&lt;h3 id="getting-started" class="relative group"&gt;Getting started &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#getting-started" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h3&gt;&lt;p&gt;Install the app as per &lt;a href="https://nikitabobko.github.io/AeroSpace/guide#installation" rel="external"&gt;official install
instructions&lt;/a&gt;.
If you have brew, do:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;brew install --cask nikitabobko/tap/aerospace
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Then put the config below into &lt;code&gt;~/.aerospace.toml&lt;/code&gt; or
&lt;code&gt;~/.config/AeroSpace/aerospace.toml&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;If you don&amp;rsquo;t know how:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="aerospace.toml" download&gt;Download this file&lt;/a&gt; as &lt;code&gt;aerospace.toml&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Open the Finder in the Downloads directory.&lt;/li&gt;
&lt;li&gt;Press &lt;kbd&gt;command+shift+.&lt;/kbd&gt; to show hidden files.&lt;/li&gt;
&lt;li&gt;Rename the file to &lt;code&gt;.aerospace.toml&lt;/code&gt; (i.e. add a leading dot &amp;ldquo;.&amp;rdquo;) and confirm.&lt;/li&gt;
&lt;li&gt;Move the file &lt;code&gt;.aerospace.toml&lt;/code&gt; into your home/user directory, in my case &amp;ldquo;jneidel&amp;rdquo;.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-toml" data-lang="toml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# See help and documentation at: https://nikitabobko.github.io/AeroSpace/guide&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# Note that the modifier &amp;#34;alt&amp;#34; is invoked by the &amp;#34;option&amp;#34; key.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;### Configuration&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;start-at-login&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# Mouse follows focus when focused monitor changes&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;on-focused-monitor-changed&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;move-mouse monitor-lazy-center&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;mode&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;main&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;binding&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# change focus: option + h/j/k/l&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;alt-h&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;focus --boundaries-action wrap-around-the-workspace left&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;alt-j&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;focus --boundaries-action wrap-around-the-workspace down&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;alt-k&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;focus --boundaries-action wrap-around-the-workspace up&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;alt-l&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;focus --boundaries-action wrap-around-the-workspace right&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# move window: option + H/J/K/L&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;alt-shift-h&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;move left&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;alt-shift-j&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;move down&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;alt-shift-k&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;move up&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;alt-shift-l&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;move right&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# change layout&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;alt-s&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;layout v_accordion&amp;#39;&lt;/span&gt; &lt;span class="c"&gt;# option + s = vertical tabs&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;alt-w&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;layout h_accordion&amp;#39;&lt;/span&gt; &lt;span class="c"&gt;# option + w = horizontal tabs&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;alt-e&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;layout tiles horizontal vertical&amp;#39;&lt;/span&gt; &lt;span class="c"&gt;# option + e = change between vertical and horizontal splits&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;alt-f&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;fullscreen&amp;#39;&lt;/span&gt; &lt;span class="c"&gt;# option + f to toggle fullscreen&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;alt-space&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;layout floating tiling&amp;#39;&lt;/span&gt; &lt;span class="c"&gt;# toggle between floating and regular window&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# go to workspace&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;alt-1&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;workspace 1&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;alt-2&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;workspace 2&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;alt-3&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;workspace 3&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;alt-4&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;workspace 4&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;alt-5&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;workspace 5&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;alt-6&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;workspace 6&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;alt-7&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;workspace 7&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;alt-8&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;workspace 8&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;alt-9&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;workspace 9&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;alt-0&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;workspace 10&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# send active window to to workspace&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;alt-shift-1&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;move-node-to-workspace 1&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;alt-shift-2&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;move-node-to-workspace 2&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;alt-shift-3&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;move-node-to-workspace 3&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;alt-shift-4&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;move-node-to-workspace 4&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;alt-shift-5&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;move-node-to-workspace 5&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;alt-shift-6&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;move-node-to-workspace 6&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;alt-shift-7&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;move-node-to-workspace 7&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;alt-shift-8&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;move-node-to-workspace 8&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;alt-shift-9&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;move-node-to-workspace 9&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;alt-shift-0&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;move-node-to-workspace 10&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# interactively resize split&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;alt-r&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;mode resize&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;mode&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;resize&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;binding&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;h&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;resize width -50&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;j&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;resize height +50&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;k&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;resize height -50&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;l&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;resize width +50&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;enter&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;mode main&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;esc&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;mode main&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;q&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;mode main&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# Move app windows to specific workspaces.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# My workspace assignment is the same as on Linux:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# Workspace 1: Emacs&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# Workspace 2: Browser&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# Workspace 3: Terminal&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# Workspace 4: Communication&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# Workspace 5: Misc&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# You can find out the app id in Karabiner EventViewer or if the app&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# is running using: $ aerospace list-apps&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# uncomment to activate&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# [[on-window-detected]]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# if.app-id = &amp;#39;org.gnu.Emacs&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# run = [&amp;#39;move-node-to-workspace 1&amp;#39;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# [[on-window-detected]]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# if.app-id = &amp;#39;org.chromium.Chromium&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# run = [&amp;#39;move-node-to-workspace 2&amp;#39;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# [[on-window-detected]]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# if.app-id = &amp;#39;net.kovidgoyal.kitty&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# run = [&amp;#39;move-node-to-workspace 3&amp;#39;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# [[on-window-detected]]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# if.app-id = &amp;#39;com.microsoft.teams2&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# run = [&amp;#39;move-node-to-workspace 4&amp;#39;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# [[on-window-detected]]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# if.app-id = &amp;#39;com.apple.mail&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# run = [&amp;#39;move-node-to-workspace 5&amp;#39;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Then start the app.
Try a keybinding like &lt;kbd&gt;option+2&lt;/kbd&gt; to confirm that it works.&lt;/p&gt;
&lt;p&gt;You can make changes to the configuration file with your editior of choice and load those changes
through the AeroSpace icon on the task bar (the icon is a number of the current workspace.)&lt;/p&gt;
&lt;h3 id="caveats" class="relative group"&gt;Caveats &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#caveats" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h3&gt;&lt;p&gt;I already mentioned the performance implication inherit to MacOS&amp;rsquo;s closed design.
AeroSpace is way slower than it&amp;rsquo;s Linux counterpart.
This is annoying, but still much better than not using AeroSpace.&lt;/p&gt;
&lt;p&gt;Sometimes you will displace a window.
You misclicked with the move command, your automatic rules moved the new window to an unexpected workspace or you it is hidden in a stack somewhere.
You will find that with practice it is easier to locate these missing windows.
Usually what happened was quite logical.
My recommendation would be to stay calm and do not fall back on the tools MacOS provides.
Mechanisms like the window selector (four fingers pinching inward) will not work well
and are ultimately an unnecessary crutch.&lt;/p&gt;
&lt;p&gt;It is recommended that you back up the configuration file, so you don&amp;rsquo;t lose them
when you migrate systems or lose the computer.
I do that through my &lt;a href="https://github.com/jneidel/dotfiles" rel="external"&gt;dotfiles&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The above config uses &lt;kbd&gt;option&lt;/kbd&gt; as it&amp;rsquo;s prefix key.
That is AeroSpaces recommendation and probably fits for most people.
Personally I use the &lt;kbd&gt;command&lt;/kbd&gt; key.&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;Why do I use command my prefix key?&lt;/summary&gt;
&lt;p&gt;I would not recommend this to non-hackers or hackers without specific requirements.&lt;/p&gt;
&lt;p&gt;Command on Mac is used all over the place.
Mapping AeroSpace stuff to command could compromise keyboard shortcuts across
the OS or inside applications.
Doing this will require significant tinkering.&lt;/p&gt;
&lt;p&gt;What makes it worth the effort to me is:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Super is my i3 window management prefix under Linux.
Super and command are the same key on my &lt;a href="https://jneidel.com/project/split-keyboard/"&gt;external split keyboard&lt;/a&gt;.
By using the exact same keybindings between MacOS and Linux I reduce the
cognitive load of switching between them.
(I also &lt;a href="https://jneidel.com/dev/consistent-keybindings-across-os/"&gt;remap &lt;kbd&gt;cmd+c&lt;/kbd&gt; to &lt;kbd&gt;ctrl+c&lt;/kbd&gt;&lt;/a&gt; for the same reason.)&lt;/li&gt;
&lt;li&gt;I want my window management to use a single key as my prefix.
AeroSpace has a limited amount of prefix keys available: command, option,
control, shift.
Command is used by MacOS and various apps.
Option and control are filled by Emacs binding (not a problem for most people.)
Shift can&amp;rsquo;t be used by itself.
Other keys like fn or hyper are not available as prefixes.&lt;/li&gt;
&lt;/ol&gt;
&lt;/details&gt;
&lt;br&gt;
&lt;details&gt;
&lt;summary&gt;My setup to use &lt;kbd&gt;command&lt;/kbd&gt; as my prefix key&lt;/summary&gt;
&lt;p&gt;I use &lt;a href="https://karabiner-elements.pqrs.org/" rel="external"&gt;Karabiner-Elements&lt;/a&gt; to translate
&lt;kbd&gt;cmd+1&lt;/kbd&gt; into &lt;kbd&gt;cmd+ctrl+alt+1&lt;/kbd&gt;.
My AeroSpace configuration then binds &amp;ldquo;switch to workspace 1&amp;rdquo; to
&lt;kbd&gt;cmd+ctrl+alt+1&lt;/kbd&gt;.
In the same way I translate &lt;kbd&gt;alt+1&lt;/kbd&gt; to &lt;kbd&gt;cmd+1&lt;/kbd&gt; to make the ability to navigate
to the first browser tab (&lt;kbd&gt;cmd+1&lt;/kbd&gt;) and others available.&lt;/p&gt;
&lt;p&gt;Here is my Karabiner config for translating command keybindings:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;description&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Map aerospace bindings to cmd&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;manipulators&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;from&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;key_code&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;1&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;modifiers&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nt"&gt;&amp;#34;mandatory&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;command&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;to&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;key_code&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;1&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;modifiers&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;left_command&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;left_option&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;left_control&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;basic&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;from&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;key_code&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;1&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;modifiers&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nt"&gt;&amp;#34;mandatory&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;command&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;shift&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;to&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;key_code&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;1&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;modifiers&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;left_command&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;left_option&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;left_control&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;left_shift&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;basic&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;from&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;key_code&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;2&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;modifiers&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nt"&gt;&amp;#34;mandatory&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;command&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;to&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;key_code&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;2&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;modifiers&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;left_command&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;left_option&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;left_control&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;basic&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;from&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;key_code&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;2&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;modifiers&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nt"&gt;&amp;#34;mandatory&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;command&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;shift&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;to&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;key_code&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;2&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;modifiers&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;left_command&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;left_option&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;left_control&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;left_shift&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;basic&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;from&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;key_code&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;3&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;modifiers&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nt"&gt;&amp;#34;mandatory&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;command&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;to&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;key_code&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;3&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;modifiers&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;left_command&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;left_option&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;left_control&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;basic&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;from&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;key_code&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;3&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;modifiers&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nt"&gt;&amp;#34;mandatory&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;command&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;shift&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;to&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;key_code&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;3&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;modifiers&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;left_command&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;left_option&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;left_control&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;left_shift&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;basic&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;from&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;key_code&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;4&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;modifiers&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nt"&gt;&amp;#34;mandatory&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;command&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;to&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;key_code&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;4&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;modifiers&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;left_command&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;left_option&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;left_control&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;basic&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;from&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;key_code&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;4&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;modifiers&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nt"&gt;&amp;#34;mandatory&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;command&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;shift&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;to&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;key_code&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;4&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;modifiers&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;left_command&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;left_option&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;left_control&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;left_shift&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;basic&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;from&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;key_code&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;5&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;modifiers&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nt"&gt;&amp;#34;mandatory&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;command&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;to&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;key_code&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;5&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;modifiers&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;left_command&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;left_option&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;left_control&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;basic&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;from&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;key_code&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;5&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;modifiers&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nt"&gt;&amp;#34;mandatory&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;command&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;shift&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;to&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;key_code&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;5&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;modifiers&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;left_command&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;left_option&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;left_control&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;left_shift&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;basic&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;from&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;key_code&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;6&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;modifiers&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nt"&gt;&amp;#34;mandatory&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;command&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;to&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;key_code&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;6&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;modifiers&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;left_command&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;left_option&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;left_control&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;basic&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;from&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;key_code&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;6&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;modifiers&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nt"&gt;&amp;#34;mandatory&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;command&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;shift&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;to&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;key_code&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;6&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;modifiers&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;left_command&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;left_option&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;left_control&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;left_shift&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;basic&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;from&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;key_code&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;7&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;modifiers&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nt"&gt;&amp;#34;mandatory&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;command&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;to&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;key_code&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;7&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;modifiers&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;left_command&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;left_option&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;left_control&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;basic&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;from&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;key_code&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;7&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;modifiers&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nt"&gt;&amp;#34;mandatory&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;command&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;shift&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;to&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;key_code&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;7&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;modifiers&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;left_command&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;left_option&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;left_control&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;left_shift&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;basic&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;from&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;key_code&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;8&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;modifiers&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nt"&gt;&amp;#34;mandatory&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;command&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;to&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;key_code&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;8&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;modifiers&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;left_command&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;left_option&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;left_control&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;basic&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;from&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;key_code&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;8&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;modifiers&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nt"&gt;&amp;#34;mandatory&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;command&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;shift&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;to&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;key_code&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;8&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;modifiers&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;left_command&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;left_option&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;left_control&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;left_shift&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;basic&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;from&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;key_code&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;9&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;modifiers&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nt"&gt;&amp;#34;mandatory&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;command&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;to&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;key_code&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;9&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;modifiers&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;left_command&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;left_option&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;left_control&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;basic&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;from&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;key_code&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;9&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;modifiers&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nt"&gt;&amp;#34;mandatory&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;command&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;shift&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;to&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;key_code&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;9&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;modifiers&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;left_command&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;left_option&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;left_control&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;left_shift&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;basic&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;from&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;key_code&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;0&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;modifiers&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nt"&gt;&amp;#34;mandatory&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;command&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;to&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;key_code&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;0&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;modifiers&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;left_command&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;left_option&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;left_control&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;basic&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;from&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;key_code&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;0&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;modifiers&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nt"&gt;&amp;#34;mandatory&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;command&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;shift&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;to&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;key_code&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;0&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;modifiers&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;left_command&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;left_option&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;left_control&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;left_shift&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;basic&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;from&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;key_code&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;p&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;modifiers&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nt"&gt;&amp;#34;mandatory&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;command&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;to&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;key_code&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;3&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;modifiers&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;left_command&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;left_shift&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;basic&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;from&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;key_code&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;p&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;modifiers&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nt"&gt;&amp;#34;mandatory&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;command&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;shift&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;to&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;key_code&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;4&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;modifiers&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;left_command&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;left_shift&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;basic&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;from&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;key_code&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;p&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;modifiers&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nt"&gt;&amp;#34;mandatory&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;command&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;control&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;to&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;key_code&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;5&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;modifiers&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;left_command&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;left_shift&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;basic&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;from&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;key_code&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;h&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;modifiers&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nt"&gt;&amp;#34;mandatory&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;command&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;to&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;key_code&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;h&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;modifiers&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;left_command&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;left_option&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;left_control&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;basic&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;from&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;key_code&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;j&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;modifiers&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nt"&gt;&amp;#34;mandatory&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;command&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;to&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;key_code&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;j&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;modifiers&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;left_command&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;left_option&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;left_control&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;basic&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;from&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;key_code&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;k&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;modifiers&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nt"&gt;&amp;#34;mandatory&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;command&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;to&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;key_code&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;k&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;modifiers&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;left_command&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;left_option&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;left_control&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;basic&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;from&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;key_code&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;l&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;modifiers&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nt"&gt;&amp;#34;mandatory&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;command&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;to&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;key_code&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;l&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;modifiers&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;left_command&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;left_option&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;left_control&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;basic&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;from&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;key_code&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;h&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;modifiers&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nt"&gt;&amp;#34;mandatory&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;command&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;shift&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;to&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;key_code&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;h&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;modifiers&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;left_command&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;left_option&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;left_control&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;left_shift&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;basic&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;from&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;key_code&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;j&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;modifiers&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nt"&gt;&amp;#34;mandatory&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;command&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;shift&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;to&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;key_code&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;j&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;modifiers&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;left_command&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;left_option&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;left_control&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;left_shift&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;basic&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;from&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;key_code&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;k&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;modifiers&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nt"&gt;&amp;#34;mandatory&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;command&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;shift&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;to&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;key_code&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;k&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;modifiers&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;left_command&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;left_option&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;left_control&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;left_shift&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;basic&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;from&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;key_code&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;l&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;modifiers&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nt"&gt;&amp;#34;mandatory&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;command&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;shift&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;to&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;key_code&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;l&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;modifiers&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;left_command&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;left_option&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;left_control&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;left_shift&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;basic&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;from&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;key_code&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;f&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;modifiers&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nt"&gt;&amp;#34;mandatory&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;command&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;to&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;key_code&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;f&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;modifiers&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;left_command&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;left_option&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;left_control&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;basic&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;from&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;key_code&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;s&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;modifiers&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nt"&gt;&amp;#34;mandatory&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;command&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;to&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;key_code&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;s&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;modifiers&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;left_command&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;left_option&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;left_control&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;basic&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;from&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;key_code&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;w&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;modifiers&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nt"&gt;&amp;#34;mandatory&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;command&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;to&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;key_code&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;w&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;modifiers&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;left_command&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;left_option&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;left_control&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;basic&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;from&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;key_code&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;e&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;modifiers&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nt"&gt;&amp;#34;mandatory&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;command&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;to&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;key_code&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;e&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;modifiers&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;left_command&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;left_option&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;left_control&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;basic&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;from&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;key_code&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;r&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;modifiers&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nt"&gt;&amp;#34;mandatory&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;command&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;to&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;key_code&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;r&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;modifiers&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;left_command&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;left_option&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;left_control&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;basic&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;You probably also want to take a look at the Karabiner config I use for
translating copy, paste, new tab, etc. to their Linux control/alt counterpart.
See &lt;a href="https://jneidel.com/dev/consistent-keybindings-across-os/"&gt;that article&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;And here is the &lt;a href="https://github.com/jneidel/dotfiles/tree/master/.config/AeroSpace/AeroSpace.toml" rel="external"&gt;AeroSpace config&lt;/a&gt; I actually use:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-toml" data-lang="toml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# i3-like window management for MacOS.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# Source: https://nikitabobko.github.io/AeroSpace/goodies#i3-like-config&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;### On the prefix key.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# On Linux I use the super key as a prefix.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# Unlike control and alt/option it is unused by applications.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# MacOS makes heavy use of command (super), so there is no easy empty prefix key available.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# Since I want one a single prefix key, that can add shift as a modifier, I used Karabiner Elements&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# to put MacOS&amp;#39;s cmd+... stuff on control and alt, replicating the Linux commands and freeing the cmd&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# to be used as the window management prefix.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# In my setup karabiner expands a cmd keypress to &amp;#34;cmd-ctrl-alt&amp;#34;, which stuff is mapped to here.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# You may forgo the Karabiner translation layer and use another key combination as you prefix.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;### Configuration&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;start-at-login&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# Mouse follows focus when focused monitor changes&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;on-focused-monitor-changed&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;move-mouse monitor-lazy-center&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;mode&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;main&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;binding&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# change focus: cmd + h/j/k/l&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;cmd-ctrl-alt-h&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;focus --boundaries-action wrap-around-the-workspace left&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;cmd-ctrl-alt-j&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;focus --boundaries-action wrap-around-the-workspace down&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;cmd-ctrl-alt-k&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;focus --boundaries-action wrap-around-the-workspace up&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;cmd-ctrl-alt-l&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;focus --boundaries-action wrap-around-the-workspace right&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# move window: cmd + H/J/K/L&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;cmd-ctrl-alt-shift-h&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;move left&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;cmd-ctrl-alt-shift-j&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;move down&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;cmd-ctrl-alt-shift-k&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;move up&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;cmd-ctrl-alt-shift-l&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;move right&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# change layout&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;cmd-ctrl-alt-s&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;layout v_accordion&amp;#39;&lt;/span&gt; &lt;span class="c"&gt;# cmd + s = vertical tabs&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;cmd-ctrl-alt-w&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;layout h_accordion&amp;#39;&lt;/span&gt; &lt;span class="c"&gt;# cmd + w = horizontal tabs&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;cmd-ctrl-alt-e&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;layout tiles horizontal vertical&amp;#39;&lt;/span&gt; &lt;span class="c"&gt;# cmd + e = change between vertical and horizontal splits&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;cmd-ctrl-alt-f&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;fullscreen&amp;#39;&lt;/span&gt; &lt;span class="c"&gt;# cmd + f to toggle fullscreen&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# alt-shift-space = &amp;#39;layout floating tiling&amp;#39; # &amp;#39;floating toggle&amp;#39; in i3&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;cmd-ctrl-alt-1&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;workspace 1&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;cmd-ctrl-alt-2&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;workspace 2&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;cmd-ctrl-alt-3&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;workspace 3&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;cmd-ctrl-alt-4&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;workspace 4&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;cmd-ctrl-alt-5&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;workspace 5&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;cmd-ctrl-alt-6&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;workspace 6&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;cmd-ctrl-alt-7&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;workspace 7&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;cmd-ctrl-alt-8&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;workspace 8&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;cmd-ctrl-alt-9&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;workspace 9&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;cmd-ctrl-alt-0&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;workspace 10&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;cmd-ctrl-alt-shift-1&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;move-node-to-workspace 1&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;cmd-ctrl-alt-shift-2&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;move-node-to-workspace 2&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;cmd-ctrl-alt-shift-3&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;move-node-to-workspace 3&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;cmd-ctrl-alt-shift-4&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;move-node-to-workspace 4&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;cmd-ctrl-alt-shift-5&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;move-node-to-workspace 5&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;cmd-ctrl-alt-shift-6&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;move-node-to-workspace 6&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;cmd-ctrl-alt-shift-7&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;move-node-to-workspace 7&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;cmd-ctrl-alt-shift-8&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;move-node-to-workspace 8&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;cmd-ctrl-alt-shift-9&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;move-node-to-workspace 9&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;cmd-ctrl-alt-shift-0&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;move-node-to-workspace 10&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# interactively resize split&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;cmd-ctrl-alt-r&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;mode resize&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;mode&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;resize&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;binding&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;h&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;resize width -50&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;j&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;resize height +50&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;k&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;resize height -50&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;l&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;resize width +50&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;enter&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;mode main&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;esc&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;mode main&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;q&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;mode main&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# Move app windows to specific workspaces.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# The workspace assignment is the same as on Linux:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# Workspace 1: Emacs&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# Workspace 2: Browser&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# Workspace 3: Terminal&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# Workspace 4: Communication&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# Workspace 5: Misc&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# You can find out the app id in Karabiner EventViewer or if the app&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# is running using: $ aerospace list-apps&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;[[&lt;/span&gt;&lt;span class="nx"&gt;on-window-detected&lt;/span&gt;&lt;span class="p"&gt;]]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;if&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;app-id&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;org.gnu.Emacs&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;run&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;move-node-to-workspace 1&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;[[&lt;/span&gt;&lt;span class="nx"&gt;on-window-detected&lt;/span&gt;&lt;span class="p"&gt;]]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;if&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;app-id&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;org.chromium.Chromium&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;run&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;move-node-to-workspace 2&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;[[&lt;/span&gt;&lt;span class="nx"&gt;on-window-detected&lt;/span&gt;&lt;span class="p"&gt;]]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;if&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;app-id&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;net.kovidgoyal.kitty&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;run&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;move-node-to-workspace 3&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;[[&lt;/span&gt;&lt;span class="nx"&gt;on-window-detected&lt;/span&gt;&lt;span class="p"&gt;]]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;if&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;app-id&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;com.microsoft.teams2&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;run&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;move-node-to-workspace 4&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;[[&lt;/span&gt;&lt;span class="nx"&gt;on-window-detected&lt;/span&gt;&lt;span class="p"&gt;]]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;if&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;app-id&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;com.apple.mail&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;run&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;move-node-to-workspace 5&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/details&gt;
&lt;h2 id="conclusion" class="relative group"&gt;Conclusion &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#conclusion" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;I showed that what keyboard-driven window management can do for you and why it&amp;rsquo;s well worth learning and using.
Using the provided minimal config you can get started right away.&lt;/p&gt;</description></item><item><title>Complete Email Setup with isync, notmuch and friends</title><link>https://jneidel.com/guide/email-setup/</link><pubDate>Mon, 03 Nov 2025 00:00:00 +0000</pubDate><author>web@jneidel.com (Jonathan Neidel)</author><guid>https://jneidel.com/guide/email-setup/</guid><description>&lt;p&gt;This is a complete guide to my email setup.
I wanted to provide and end-to-end experience showing everything and every step involved.
That means the configuration at my hosting and DNS providers, mail sending, syncing and indexing tools and the user interface.
This is not for a single mailbox, but sending and receiving from any address on multiple domains.&lt;/p&gt;
&lt;p&gt;All of my tool/provider choices in this guide can be replaced once you understand the role that particular part fulfills.&lt;/p&gt;
&lt;h2 id="hosting-providers" class="relative group"&gt;Hosting providers &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#hosting-providers" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;These providers make sure mail is collectable from a mailbox and that it can be sent.&lt;/p&gt;
&lt;h3 id="domains" class="relative group"&gt;Domains &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#domains" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h3&gt;&lt;p&gt;I use &lt;a href="https://www.namecheap.com/" rel="external"&gt;namecheap&lt;/a&gt;.
Good prices and easy enough user interface.&lt;/p&gt;
&lt;p&gt;I have the following domains with them:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;jneidel.com&lt;/li&gt;
&lt;li&gt;jneidel.de&lt;/li&gt;
&lt;li&gt;neidel.xyz&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="mailserver" class="relative group"&gt;Mailserver &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#mailserver" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h3&gt;&lt;p&gt;I use &lt;a href="https://uberspace.de/" rel="external"&gt;uberspace&lt;/a&gt;.
They got great docs and a flexible pricing model that, though a model of solidary, provides hosting even to
those who would be otherwise unable to afford it.
I have been with them for many years.&lt;/p&gt;

 
 
 
 
 
 
 

 
 
 

 
 

 
 
 &lt;figure class="w-6/12 mx-auto my-0 rounded-sm"&gt;
 
 
 









 
 
 
 
 
 
 
 
 
 
 
 
 
 
 &lt;picture class="w-6/12 mx-auto my-0 rounded-sm" &gt;
 &lt;img
 src="https://jneidel.com/guide/email-setup/uberspace-logo.svg"
 width="260"
 height="180"
 class="w-6/12 mx-auto my-0 rounded-sm"
 alt="Uberspace logo"
 loading="lazy" decoding="async"
 
 /&gt;
 &lt;/picture&gt;
 


 
 &lt;/figure&gt;


&lt;p&gt;With the command &lt;code&gt;uberspace mail domain add neidel.xyz&lt;/code&gt; I can add a mail domain:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;The mailservers configuration has been adapted.
Now you can use the following records for your DNS:

neidel.xyz. IN MX 0 pizarro.uberspace.de.
neidel.xyz. IN TXT &amp;quot;v=spf1 include:spf.uberspace.de ~all&amp;quot;
uberspace._domainkey.neidel.xyz. IN TXT &amp;quot;v=DKIM1;t=s;n=core;p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAonmVoIli72aSHhW9LyMrnrkcYfCddeqHyQkK8aIkpBDhJObkbX+9b+p+V/+dJz86IUd3zi1Flj41Wt3TqS8/WQg2NVUKsAJMUSrO00gz+3Gqw0e0cT0BJ4YXSFr8kzwro79A9rh6ZJta6/E4xg+7DgQcIFh8Qy1XcLV2wPimQDQRWAAFMO5nXqQea9Vuvid2n2SoCTE9BXhNg4TwDRiZZTxSzTigU7iDSTBuS75wH0XtOBIMpc0OeK+2Jz3E/33/0V28rCGcPLX2FPSXvfDPY/9VmQzc0jDW8mz4SJ4/bS6Gj8qWtVlVXEEVZ3Fa2aWQ1W8vJrAelo/31dq9kcd+aQIDAQAB&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The output tell me what to add in namecheap in the domain under &amp;ldquo;Advanced DNS&amp;rdquo;:

 
 
 
 
 
 
 

 
 
 

 
 

 
 
 
 
 
 &lt;figure class="w-12/12 mx-auto my-0 rounded-sm"&gt;
 &lt;img src="./namecheap-dns-setup.png" alt="DNS setup of MX, SPF and DKIM records." class="w-12/12 mx-auto my-0 rounded-sm"/&gt;
 
 &lt;/figure&gt;

&lt;/p&gt;
&lt;p&gt;This configuration includes DKIM signatures and SPF headers.
Without a valid DKIM signature emails sent to e.g. Gmail addresses will be blocked.
The validity of these records are &lt;a href="https://jneidel.com/guide/email-setup/#testing"&gt;tested&lt;/a&gt; later.&lt;/p&gt;
&lt;h4 id="mailboxes" class="relative group"&gt;Mailboxes &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#mailboxes" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h4&gt;&lt;p&gt;To gain access to mail delivered to a configured domain we need to create a
mailbox:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;uberspace mail user add jneidel
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;I want mail sent to any address of my domains to go into the same mailbox/maildir, so
I set it up as a catch-all:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;uberspace mail catchall &lt;span class="nb"&gt;set&lt;/span&gt; jneidel
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;(See the &lt;a href="https://manual.uberspace.de/mail-mailboxes" rel="external"&gt;uberspace docs&lt;/a&gt;.)&lt;/p&gt;
&lt;h2 id="mail-utilities" class="relative group"&gt;Mail utilities &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#mail-utilities" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;These tools are necessary to secure, retrieve, send and index mail.&lt;/p&gt;
&lt;h3 id="gpg" class="relative group"&gt;GPG &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#gpg" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h3&gt;&lt;p&gt;To securely store my mail password I use &lt;a href="https://www.passwordstore.org/" rel="external"&gt;&lt;code&gt;pass&lt;/code&gt;&lt;/a&gt;, which encrypts the passwords with my
GPG key.&lt;/p&gt;
&lt;p&gt;You can create your own key, ideally with a secure password generated with the &lt;a href="https://www.eff.org/dice" rel="external"&gt;dice&lt;/a&gt; method:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;gpg --full-generate-key
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Install the relevant programs for the usage:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;yay -S pass pinentry
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Add the mail server password to pass:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;pass add jneidel@jneidel.de
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Configure your favorite pin entry program in &lt;code&gt;~/.config/gnupg/gpg-agent.conf&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="l"&gt;pinentry-program /bin/pinentry-gtk&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="l"&gt;default-cache-ttl 43200&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# 12h, refreshes with each use of the key&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="l"&gt;max-cache-ttl 259200 &lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# 3d&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Do restart the gpg-agent after changes (find the command in &lt;code&gt;htop&lt;/code&gt;, kill the process and execute the command again.)&lt;/p&gt;
&lt;p&gt;(Here is some more information about &lt;a href="https://vadosware.io/post/fixing-pinentry-with-emacs/#why-was-my-emacs--pinentry-setup-broken" rel="external"&gt;pin&lt;/a&gt; &lt;a href="http://yitang.uk/2023/12/28/gpg-in-emacs-first-step-towards-data-security/" rel="external"&gt;entry&lt;/a&gt;.)&lt;/p&gt;
&lt;h3 id="retrival-and-sync" class="relative group"&gt;Retrival and sync &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#retrival-and-sync" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h3&gt;&lt;p&gt;We need to configure a program to download email from the IMAP server for
offline use.
This program will also sync any changes we do back to the server.&lt;/p&gt;
&lt;p&gt;I use &lt;code&gt;mbsync&lt;/code&gt;, which is part of &lt;a href="https://isync.sourceforge.io/" rel="external"&gt;isync&lt;/a&gt;.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;yay -S isync
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;In &lt;code&gt;~/.config/isyncrc&lt;/code&gt; I have:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="l"&gt;IMAPStore jneidel@jneidel.de-remote&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="l"&gt;Host pizarro.uberspace.de&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="l"&gt;Port 993&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="l"&gt;User jneidel@jneidel.de&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="l"&gt;PassCmd &amp;#34;pass jneidel@jneidel.de&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="l"&gt;AuthMechs LOGIN&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="l"&gt;TLSType IMAPS&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="l"&gt;CertificateFile /etc/ssl/certs/ca-certificates.crt&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="l"&gt;MaildirStore jneidel@jneidel.de-local&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="l"&gt;Subfolders Verbatim&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="l"&gt;Path /home/jneidel/.local/share/mail/jneidel@jneidel.de/&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="l"&gt;Inbox /home/jneidel/.local/share/mail/jneidel@jneidel.de/INBOX&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="l"&gt;Channel jneidel@jneidel.de&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="l"&gt;Expunge Both&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;Far :jneidel@jneidel.de-remote&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;Near :jneidel@jneidel.de-local&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="l"&gt;Patterns * !&amp;#34;*virtual*&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="l"&gt;Create Both&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="l"&gt;SyncState *&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="l"&gt;MaxMessages 0&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="l"&gt;ExpireUnread no&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;The host is the one from the domain setup.&lt;/li&gt;
&lt;li&gt;The port value can be found in &lt;a href="https://manual.uberspace.de/mail-access/" rel="external"&gt;the uberspace docs&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;The password was stored in &lt;code&gt;pass&lt;/code&gt; in the previous step.&lt;/li&gt;
&lt;li&gt;I designated &lt;code&gt;~/.local/share/mail&lt;/code&gt; as my local maildir.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I use &lt;a href="https://github.com/jneidel/dotfiles/blob/master/scripts/mail/mailsync" rel="external"&gt;&lt;code&gt;~/scripts/mail/mailsync&lt;/code&gt;&lt;/a&gt; invoking &lt;code&gt;mbsync&lt;/code&gt; to synchronize my mail:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#!/bin/sh
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;MAILSYNC_MUTE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$1&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;--help&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$1&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;-h&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$1&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;help&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; cat &lt;span class="s"&gt;&amp;lt;&amp;lt;EOF
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;$ mailsync [ACCOUNT]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;Sync mail and index it.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;Run it:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;- via goimapnotify (server has received new mail hook)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;- via cron (timer)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;Source: https://github.com/LukeSmithxyz/mutt-wizard
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;Changes: pop removed, notifications disabled, .config/neomvim and .config/isync as config dirs.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;Parameters:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; [\$1]: account to sync, by default syncs all
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;Example:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; $ mailsync
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; $ mailsync jneidel@jneidel.com
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;EOF&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;exit&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;hash&lt;/span&gt; mbsync notmuch &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nb"&gt;exit&lt;/span&gt; &lt;span class="m"&gt;127&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# There are many arbitrary and ugly features in this script because it is&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# inherently difficult to pass environmental variables to cronjobs and other&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# issues. It also should at least be compatible with Linux (and maybe BSD) with&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Xorg and MacOS as well.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Run only if user logged in (prevent cron errors)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;pgrep -u &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;USER&lt;/span&gt;&lt;span class="p"&gt;:=&lt;/span&gt;&lt;span class="nv"&gt;$LOGNAME&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &amp;gt;/dev/null &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$USER&lt;/span&gt;&lt;span class="s2"&gt; not logged in; sync will not run.&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nb"&gt;exit&lt;/span&gt; &lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Run only if not already running in other instance&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;pgrep mbsync &amp;gt;/dev/null &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;mbsync is already running.&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nb"&gt;exit&lt;/span&gt; &lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# First, we have to get the right variables for the mbsync file, the pass&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# archive, notmuch and the GPG home. This is done by searching common profile&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# files for variable assignments. This is ugly, but there are few options that&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# will work on the maximum number of machines.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;eval&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;grep -h -- &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;^\s*\(export \)\?\(MBSYNCRC\|PASSWORD_STORE_DIR\|NOTMUCH_CONFIG\|GNUPGHOME\)=&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$HOME&lt;/span&gt;&lt;span class="s2"&gt;/.profile&amp;#34;&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$HOME&lt;/span&gt;&lt;span class="s2"&gt;/.bash_profile&amp;#34;&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$HOME&lt;/span&gt;&lt;span class="s2"&gt;/.zprofile&amp;#34;&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$HOME&lt;/span&gt;&lt;span class="s2"&gt;/.config/zsh/.zprofile&amp;#34;&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$HOME&lt;/span&gt;&lt;span class="s2"&gt;/.zshenv&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$HOME&lt;/span&gt;&lt;span class="s2"&gt;/.config/zsh/.zshenv&amp;#34;&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$HOME&lt;/span&gt;&lt;span class="s2"&gt;/.bashrc&amp;#34;&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$HOME&lt;/span&gt;&lt;span class="s2"&gt;/.zshrc&amp;#34;&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$HOME&lt;/span&gt;&lt;span class="s2"&gt;/.config/zsh/.zshrc&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$HOME&lt;/span&gt;&lt;span class="s2"&gt;/.pam_environment&amp;#34;&lt;/span&gt; 2&amp;gt;/dev/null&lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# export GPG_TTY=&amp;#34;$(tty)&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;[&lt;/span&gt; -n &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$MBSYNCRC&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;alias&lt;/span&gt; &lt;span class="nv"&gt;mbsync&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;mbsync -c &lt;/span&gt;&lt;span class="nv"&gt;$MBSYNCRC&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nv"&gt;MBSYNCRC&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$HOME&lt;/span&gt;/.config/isyncrc
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;lastrun&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;XDG_CONFIG_HOME&lt;/span&gt;&lt;span class="k"&gt;:-&lt;/span&gt;&lt;span class="nv"&gt;$HOME&lt;/span&gt;&lt;span class="p"&gt;/.config&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/neomutt/.mailsynclastrun&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Settings are different for MacOS (Darwin) systems.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;uname&lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; in
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Darwin&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; notify&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; osascript -e &lt;span class="s2"&gt;&amp;#34;display notification \&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$2&lt;/span&gt;&lt;span class="s2"&gt; in &lt;/span&gt;&lt;span class="nv"&gt;$1&lt;/span&gt;&lt;span class="s2"&gt;\&amp;#34; with title \&amp;#34;You&amp;#39;ve got Mail\&amp;#34; subtitle \&amp;#34;Account: &lt;/span&gt;&lt;span class="nv"&gt;$account&lt;/span&gt;&lt;span class="s2"&gt;\&amp;#34;&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; sleep &lt;span class="m"&gt;2&lt;/span&gt; &lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; *&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;readlink -f /sbin/init&lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; in
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; *systemd*&lt;span class="p"&gt;|&lt;/span&gt;*openrc*&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="nb"&gt;export&lt;/span&gt; &lt;span class="nv"&gt;DBUS_SESSION_BUS_ADDRESS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;unix:path&lt;span class="o"&gt;=&lt;/span&gt;/run/user/&lt;span class="k"&gt;$(&lt;/span&gt;id -u&lt;span class="k"&gt;)&lt;/span&gt;/bus &lt;span class="p"&gt;;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;esac&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# remember if a display server is running since `ps` doesn&amp;#39;t always contain a display&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;pgrepoutput&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;pgrep -a X&lt;span class="se"&gt;\(&lt;/span&gt;org&lt;span class="se"&gt;\|&lt;/span&gt;wayland&lt;span class="se"&gt;\)&lt;/span&gt;&lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;displays&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$pgrepoutput&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; grep -wo &lt;span class="s2"&gt;&amp;#34;[0-9]*:[0-9]\+&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; sort -u&lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; notify&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; -n &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$pgrepoutput&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; x in &lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;displays&lt;/span&gt;&lt;span class="k"&gt;:-&lt;/span&gt;&lt;span class="nv"&gt;0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;export&lt;/span&gt; &lt;span class="nv"&gt;DISPLAY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$x&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; notify-send --app-name&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;mutt-wizard&amp;#34;&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;New mail!&amp;#34;&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;📬 &lt;/span&gt;&lt;span class="nv"&gt;$2&lt;/span&gt;&lt;span class="s2"&gt; new mail(s) in \`&lt;/span&gt;&lt;span class="nv"&gt;$1&lt;/span&gt;&lt;span class="s2"&gt;\` account.&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;done&lt;/span&gt; &lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;esac&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Check account for new mail. Notify if there is new content.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;syncandnotify&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;acc&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$account&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; sed &lt;span class="s2"&gt;&amp;#34;s/.*\///&amp;#34;&lt;/span&gt;&lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; -z &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$opts&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt; mbsync &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$acc&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; mbsync &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$opts&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$acc&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;new&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;find&lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$HOME&lt;/span&gt;&lt;span class="s2"&gt;/.local/share/mail/&lt;/span&gt;&lt;span class="nv"&gt;$acc&lt;/span&gt;&lt;span class="s2"&gt;/INBOX/new/&amp;#34;&lt;/span&gt;&lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$HOME&lt;/span&gt;&lt;span class="s2"&gt;/.local/share/mail/&lt;/span&gt;&lt;span class="nv"&gt;$acc&lt;/span&gt;&lt;span class="s2"&gt;/Inbox/new/&amp;#34;&lt;/span&gt;&lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$HOME&lt;/span&gt;&lt;span class="s2"&gt;/.local/share/mail/&lt;/span&gt;&lt;span class="nv"&gt;$acc&lt;/span&gt;&lt;span class="s2"&gt;/inbox/new/&amp;#34;&lt;/span&gt;&lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$HOME&lt;/span&gt;&lt;span class="s2"&gt;/.local/share/mail/&lt;/span&gt;&lt;span class="nv"&gt;$acc&lt;/span&gt;&lt;span class="s2"&gt;/INBOX/cur/&amp;#34;&lt;/span&gt;&lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$HOME&lt;/span&gt;&lt;span class="s2"&gt;/.local/share/mail/&lt;/span&gt;&lt;span class="nv"&gt;$acc&lt;/span&gt;&lt;span class="s2"&gt;/Inbox/cur/&amp;#34;&lt;/span&gt;&lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$HOME&lt;/span&gt;&lt;span class="s2"&gt;/.local/share/mail/&lt;/span&gt;&lt;span class="nv"&gt;$acc&lt;/span&gt;&lt;span class="s2"&gt;/inbox/cur/&amp;#34;&lt;/span&gt;&lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -type f -newer &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$lastrun&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; 2&amp;gt; /dev/null&lt;span class="k"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;newcount&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$new&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; sed &lt;span class="s1"&gt;&amp;#39;/^\s*$/d&amp;#39;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; wc -l&lt;span class="k"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt; in
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;$((&lt;/span&gt;newcount &amp;gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="k"&gt;))&lt;/span&gt; &lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; -z &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$MAILSYNC_MUTE&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; notify &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$acc&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$newcount&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;esac&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Sync accounts passed as argument or all.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$#&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; -eq &lt;span class="s2"&gt;&amp;#34;0&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;accounts&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;awk &lt;span class="s1"&gt;&amp;#39;/^Channel/ {print $2}&amp;#39;&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$MBSYNCRC&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;else&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;for&lt;/span&gt; arg in &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$@&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;arg&lt;/span&gt;&lt;span class="p"&gt;%&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;arg&lt;/span&gt;&lt;span class="p"&gt;#?&lt;/span&gt;&lt;span class="si"&gt;}}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;-&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nv"&gt;opts&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;opts&lt;/span&gt;&lt;span class="p"&gt;:+&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;opts&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt; &lt;/span&gt;&lt;span class="si"&gt;}${&lt;/span&gt;&lt;span class="nv"&gt;arg&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;shift&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;done&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;accounts&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$*&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Parallelize multiple accounts&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;for&lt;/span&gt; account in &lt;span class="nv"&gt;$accounts&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; syncandnotify &lt;span class="p"&gt;&amp;amp;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;done&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;wait&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;notmuch new
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;afew --tag --new
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;afew --move-mails --all
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Create a touch file that indicates the time of the last run of mailsync&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;touch &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$lastrun&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This script could be simpler, but for now it just works.
It was adapted from&lt;a href="https://github.com/lukesmithxyz/mutt-wizard" rel="external"&gt; mutt-wizard&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The script could be invoke at a regular interval through cron, but we can do it even better than that.&lt;/p&gt;
&lt;h3 id="sync-on-imap-change" class="relative group"&gt;Sync on IMAP change &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#sync-on-imap-change" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h3&gt;&lt;p&gt;Why not let the IMAP server inform us of new mail and only sync then?
&lt;a href="https://gitlab.com/shackra/goimapnotify" rel="external"&gt;goimapnotify&lt;/a&gt; does exactly that.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;yay -S goimapnotify
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;In &lt;code&gt;~/.config/imapnotify/jneidel@jneidel.de&lt;/code&gt; we tell it what to do:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;#34;host&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;pizarro.uberspace.de&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;#34;port&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;993&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;#34;tls&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;#34;tlsOptions&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;#34;rejectUnauthorized&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;#34;username&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;jneidel@jneidel.de&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;#34;password&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;#34;passwordCmd&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;pass jneidel@jneidel.de&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;#34;onNewMail&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;/home/jneidel/scripts/mail/mailsync&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;#34;onNewMailPost&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;#34;boxes&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;INBOX&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;To activate run this on startup (I have it in my &lt;code&gt;~/.xinitrc&lt;/code&gt;):&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;goimapnotify -conf ~/.config/imapnotify/jneidel.de.yaml &amp;gt;/dev/null 2&amp;gt;&lt;span class="p"&gt;&amp;amp;&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt; &lt;span class="p"&gt;&amp;amp;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="sending-mail" class="relative group"&gt;Sending mail &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#sending-mail" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h3&gt;&lt;p&gt;For sending mail (SMTP) I use &lt;code&gt;msmtp&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;yay -S msmtp
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;It is configured in &lt;code&gt;~/.config/msmtp/config&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="l"&gt;account jneidel@jneidel.de&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="l"&gt;host pizarro.uberspace.de&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="l"&gt;port 465&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="l"&gt;from jneidel@jneidel.de&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="l"&gt;user jneidel@jneidel.de&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="l"&gt;passwordeval &amp;#34;pass jneidel@jneidel.de&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="l"&gt;auth on&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="l"&gt;tls on&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="l"&gt;tls_trust_file	/etc/ssl/certs/ca-certificates.crt&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="l"&gt;logfile /home/jneidel/.local/share/msmtp/jneidel.de.log&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="l"&gt;tls_starttls off&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;account default &lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;jneidel@jneidel.de&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The &lt;code&gt;account default&lt;/code&gt; acts like a catch-all for sending, so I don&amp;rsquo;t have to
configure each sender address individually.
This way I can respond to a mail I received on &amp;ldquo;&lt;a href="mailto:abc@jneidel.com" rel="external"&gt;abc@jneidel.com&lt;/a&gt;&amp;rdquo; from
&amp;ldquo;&lt;a href="mailto:abc@jneidel.com" rel="external"&gt;abc@jneidel.com&lt;/a&gt;&amp;rdquo;, not just from &amp;ldquo;&lt;a href="mailto:jneidel@jneidel.de" rel="external"&gt;jneidel@jneidel.de&lt;/a&gt;&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;The SMTP port was also found in the &lt;a href="https://manual.uberspace.de/mail-access/" rel="external"&gt;docs&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id="mail-indexing" class="relative group"&gt;Mail indexing &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#mail-indexing" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h3&gt;&lt;p&gt;I use &lt;a href="https://notmuchmail.org/" rel="external"&gt;notmuch&lt;/a&gt; to index my email.
It makes it very quick to search.
Since I use notmuch as my &lt;a href="https://jneidel.com/guide/email-setup/#mail-client"&gt;mail client&lt;/a&gt; this is required for me, but optional otherwise.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;yay -S notmuch
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Configuration is handled in this redefined config location:
&lt;code&gt;export NOTMUCH_CONFIG=~/.config/notmuch-config&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-toml" data-lang="toml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;database&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;path&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="err"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;home&lt;/span&gt;&lt;span class="err"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;jneidel&lt;/span&gt;&lt;span class="err"&gt;/&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;local&lt;/span&gt;&lt;span class="err"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;share&lt;/span&gt;&lt;span class="err"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;mail&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="nx"&gt;Jonathan&lt;/span&gt; &lt;span class="nx"&gt;Neidel&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;primary_email&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="nx"&gt;jneidel&lt;/span&gt;&lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="nx"&gt;jneidel&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;de&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;other_email&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="nx"&gt;jneidel&lt;/span&gt;&lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="nx"&gt;jneidel&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;com&lt;/span&gt;&lt;span class="err"&gt;;&lt;/span&gt;&lt;span class="nx"&gt;j&lt;/span&gt;&lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="nx"&gt;neidel&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;xyz&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;new&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;tags&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="nx"&gt;unread&lt;/span&gt;&lt;span class="err"&gt;;&lt;/span&gt;&lt;span class="nx"&gt;inbox&lt;/span&gt;&lt;span class="err"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;ignore&lt;/span&gt;&lt;span class="p"&gt;=.&lt;/span&gt;&lt;span class="nx"&gt;mbsyncstate&lt;/span&gt;&lt;span class="err"&gt;;&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;uidvalidity&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;search&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;exclude_tags&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="nx"&gt;deleted&lt;/span&gt;&lt;span class="err"&gt;;&lt;/span&gt;&lt;span class="nx"&gt;spam&lt;/span&gt;&lt;span class="err"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;maildir&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;synchronize_flags&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;crypto&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;gpg_path&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="nx"&gt;gpg&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Notmuch does not provide tagging automation or mail moving.
For that I use &lt;a href="https://github.com/afewmail/afew" rel="external"&gt;afew&lt;/a&gt;.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;yay -S afew
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Configured in &lt;code&gt;~/.config/afew/config&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-toml" data-lang="toml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;Filter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;message&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;Remove&lt;/span&gt; &lt;span class="nx"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;tag&lt;/span&gt; &lt;span class="nx"&gt;everywhere&lt;/span&gt; &lt;span class="nx"&gt;but&lt;/span&gt; &lt;span class="nx"&gt;INBOX&lt;/span&gt; &lt;span class="nx"&gt;folder&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;query&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;NOT&lt;/span&gt; &lt;span class="nx"&gt;folder&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="nx"&gt;jneidel&lt;/span&gt;&lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="nx"&gt;jneidel&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;de&lt;/span&gt;&lt;span class="err"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;INBOX&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;tags&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;-unread&lt;/span&gt;&lt;span class="err"&gt;;&lt;/span&gt;&lt;span class="nx"&gt;-inbox&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;Filter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;message&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;Hide&lt;/span&gt; &lt;span class="nx"&gt;jobdirecto&lt;/span&gt; &lt;span class="nx"&gt;mails&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;query&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;folder&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="nx"&gt;jneidel&lt;/span&gt;&lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="nx"&gt;jneidel&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;de&lt;/span&gt;&lt;span class="err"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;INBOX&lt;/span&gt; &lt;span class="nx"&gt;AND&lt;/span&gt; &lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="nx"&gt;wilfredocasas100&lt;/span&gt;&lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="nx"&gt;gmail&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;com&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;tags&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;-unread&lt;/span&gt;&lt;span class="err"&gt;;+&lt;/span&gt;&lt;span class="nx"&gt;spam&lt;/span&gt;&lt;span class="err"&gt;;&lt;/span&gt;&lt;span class="nx"&gt;-inbox&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;Filter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;message&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;Remove&lt;/span&gt; &lt;span class="nx"&gt;Lidl&lt;/span&gt; &lt;span class="nx"&gt;Pay&lt;/span&gt; &lt;span class="nx"&gt;confirmations&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;query&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;subject&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="nx"&gt;Abbuchungsank&lt;/span&gt;&lt;span class="err"&gt;ü&lt;/span&gt;&lt;span class="nx"&gt;ndigung&lt;/span&gt; &lt;span class="nx"&gt;AND&lt;/span&gt; &lt;span class="nx"&gt;from&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="nx"&gt;lidlpay&lt;/span&gt;&lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="nx"&gt;lidl&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;de&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;tags&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="err"&gt;+&lt;/span&gt;&lt;span class="nx"&gt;trash&lt;/span&gt;&lt;span class="err"&gt;;&lt;/span&gt;&lt;span class="nx"&gt;-unread&lt;/span&gt;&lt;span class="err"&gt;;&lt;/span&gt;&lt;span class="nx"&gt;-inbox&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;Filter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;message&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;Hide&lt;/span&gt; &lt;span class="nx"&gt;bellicon&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;query&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;from&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="nx"&gt;affiliate&lt;/span&gt;&lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="nx"&gt;bellicon&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;com&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;tags&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="err"&gt;+&lt;/span&gt;&lt;span class="nx"&gt;spam&lt;/span&gt;&lt;span class="err"&gt;;&lt;/span&gt;&lt;span class="nx"&gt;-unread&lt;/span&gt;&lt;span class="err"&gt;;&lt;/span&gt;&lt;span class="nx"&gt;-inbox&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;Filter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;message&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;Remove&lt;/span&gt; &lt;span class="nx"&gt;IB&lt;/span&gt; &lt;span class="nx"&gt;trade&lt;/span&gt; &lt;span class="nx"&gt;confirmations&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;query&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;subject&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="nx"&gt;Trade&lt;/span&gt; &lt;span class="nx"&gt;Confirmation&lt;/span&gt; &lt;span class="nx"&gt;Flex&lt;/span&gt; &lt;span class="nx"&gt;AND&lt;/span&gt; &lt;span class="nx"&gt;from&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="nx"&gt;donotreply&lt;/span&gt;&lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="nx"&gt;interactivebrokers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;com&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;tags&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="err"&gt;+&lt;/span&gt;&lt;span class="nx"&gt;trash&lt;/span&gt;&lt;span class="err"&gt;;&lt;/span&gt;&lt;span class="nx"&gt;-unread&lt;/span&gt;&lt;span class="err"&gt;;&lt;/span&gt;&lt;span class="nx"&gt;-inbox&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;Filter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;message&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;Move&lt;/span&gt; &lt;span class="nx"&gt;Telekom&lt;/span&gt; &lt;span class="nx"&gt;invoices&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;query&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;subject&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Telekom Festnetz-Rechnung&amp;#39;&lt;/span&gt; &lt;span class="nx"&gt;AND&lt;/span&gt; &lt;span class="nx"&gt;from&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="nx"&gt;rechnungonline&lt;/span&gt;&lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="nx"&gt;telekom&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;de&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;tags&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="err"&gt;+&lt;/span&gt;&lt;span class="nx"&gt;invoice&lt;/span&gt;&lt;span class="err"&gt;;&lt;/span&gt;&lt;span class="nx"&gt;-unread&lt;/span&gt;&lt;span class="err"&gt;;&lt;/span&gt;&lt;span class="nx"&gt;-inbox&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;Filter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;message&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;Blutspende&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;query&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="nx"&gt;spenderservice&lt;/span&gt;&lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="nx"&gt;jneidel&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;com&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;tags&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="err"&gt;+&lt;/span&gt;&lt;span class="nx"&gt;trash&lt;/span&gt;&lt;span class="err"&gt;;&lt;/span&gt;&lt;span class="nx"&gt;-unread&lt;/span&gt;&lt;span class="err"&gt;;&lt;/span&gt;&lt;span class="nx"&gt;-inbox&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;Filter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;message&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;Tag&lt;/span&gt; &lt;span class="nx"&gt;mail&lt;/span&gt; &lt;span class="nx"&gt;in&lt;/span&gt; &lt;span class="nx"&gt;sent&lt;/span&gt; &lt;span class="nx"&gt;dir&lt;/span&gt; &lt;span class="nx"&gt;as&lt;/span&gt; &lt;span class="nx"&gt;sent&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;query&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;folder&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="nx"&gt;jneidel&lt;/span&gt;&lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="nx"&gt;jneidel&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;com&lt;/span&gt;&lt;span class="err"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;Sent&lt;/span&gt; &lt;span class="nx"&gt;OR&lt;/span&gt; &lt;span class="nx"&gt;folder&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="nx"&gt;jneidel&lt;/span&gt;&lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="nx"&gt;jneidel&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;de&lt;/span&gt;&lt;span class="err"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;Sent&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;tags&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="err"&gt;+&lt;/span&gt;&lt;span class="nx"&gt;sent&lt;/span&gt;&lt;span class="err"&gt;;&lt;/span&gt;&lt;span class="nx"&gt;-unread&lt;/span&gt;&lt;span class="err"&gt;;&lt;/span&gt;&lt;span class="nx"&gt;-inbox&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;Filter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;message&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;Tag&lt;/span&gt; &lt;span class="nx"&gt;mail&lt;/span&gt; &lt;span class="nx"&gt;in&lt;/span&gt; &lt;span class="nx"&gt;archive&lt;/span&gt; &lt;span class="nx"&gt;dir&lt;/span&gt; &lt;span class="nx"&gt;as&lt;/span&gt; &lt;span class="nx"&gt;archieved&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;query&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;folder&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="nx"&gt;jneidel&lt;/span&gt;&lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="nx"&gt;jneidel&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;com&lt;/span&gt;&lt;span class="err"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;archive&lt;/span&gt; &lt;span class="nx"&gt;OR&lt;/span&gt; &lt;span class="nx"&gt;folder&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="nx"&gt;jneidel&lt;/span&gt;&lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="nx"&gt;jneidel&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;de&lt;/span&gt;&lt;span class="err"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;archive&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;tags&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="err"&gt;+&lt;/span&gt;&lt;span class="nx"&gt;archived&lt;/span&gt;&lt;span class="err"&gt;;&lt;/span&gt;&lt;span class="nx"&gt;-unread&lt;/span&gt;&lt;span class="err"&gt;;&lt;/span&gt;&lt;span class="nx"&gt;-inbox&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;Filter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;message&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;Tag&lt;/span&gt; &lt;span class="nx"&gt;mail&lt;/span&gt; &lt;span class="nx"&gt;in&lt;/span&gt; &lt;span class="nx"&gt;invoices&lt;/span&gt; &lt;span class="nx"&gt;dir&lt;/span&gt; &lt;span class="nx"&gt;as&lt;/span&gt; &lt;span class="nx"&gt;invoice&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;query&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;folder&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="nx"&gt;jneidel&lt;/span&gt;&lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="nx"&gt;jneidel&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;com&lt;/span&gt;&lt;span class="err"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;invoices&lt;/span&gt; &lt;span class="nx"&gt;OR&lt;/span&gt; &lt;span class="nx"&gt;folder&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="nx"&gt;jneidel&lt;/span&gt;&lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="nx"&gt;jneidel&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;de&lt;/span&gt;&lt;span class="err"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;invoices&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;tags&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="err"&gt;+&lt;/span&gt;&lt;span class="nx"&gt;invoice&lt;/span&gt;&lt;span class="err"&gt;;&lt;/span&gt;&lt;span class="nx"&gt;-unread&lt;/span&gt;&lt;span class="err"&gt;;&lt;/span&gt;&lt;span class="nx"&gt;-inbox&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;ArchiveSentMailsFilter&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;sent_tag&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;sent&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;MailMover&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;folders&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;jneidel&lt;/span&gt;&lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="nx"&gt;jneidel&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;de&lt;/span&gt;&lt;span class="err"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;INBOX&lt;/span&gt; &lt;span class="nx"&gt;jneidel&lt;/span&gt;&lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="nx"&gt;jneidel&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;de&lt;/span&gt;&lt;span class="err"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;archive&lt;/span&gt; &lt;span class="nx"&gt;jneidel&lt;/span&gt;&lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="nx"&gt;jneidel&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;de&lt;/span&gt;&lt;span class="err"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;spam&lt;/span&gt; &lt;span class="nx"&gt;jneidel&lt;/span&gt;&lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="nx"&gt;jneidel&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;de&lt;/span&gt;&lt;span class="err"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;invoices&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;rename&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;True&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;jneidel&lt;/span&gt;&lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="nx"&gt;jneidel&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;de&lt;/span&gt;&lt;span class="err"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;INBOX&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;tag:spam&amp;#39;&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="nx"&gt;jneidel&lt;/span&gt;&lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="nx"&gt;jneidel&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;de&lt;/span&gt;&lt;span class="err"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;spam&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;tag:trash&amp;#39;&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="nx"&gt;jneidel&lt;/span&gt;&lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="nx"&gt;jneidel&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;de&lt;/span&gt;&lt;span class="err"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;Trash&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;tag:invoice&amp;#39;&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="nx"&gt;jneidel&lt;/span&gt;&lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="nx"&gt;jneidel&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;de&lt;/span&gt;&lt;span class="err"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;invoices&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;tag:archived&amp;#39;&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="nx"&gt;jneidel&lt;/span&gt;&lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="nx"&gt;jneidel&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;de&lt;/span&gt;&lt;span class="err"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;archive&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;jneidel&lt;/span&gt;&lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="nx"&gt;jneidel&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;de&lt;/span&gt;&lt;span class="err"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;spam&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;tag:trash&amp;#39;&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="nx"&gt;jneidel&lt;/span&gt;&lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="nx"&gt;jneidel&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;de&lt;/span&gt;&lt;span class="err"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;Trash&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;jneidel&lt;/span&gt;&lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="nx"&gt;jneidel&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;de&lt;/span&gt;&lt;span class="err"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;archive&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;tag:trash&amp;#39;&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="nx"&gt;jneidel&lt;/span&gt;&lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="nx"&gt;jneidel&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;de&lt;/span&gt;&lt;span class="err"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;Trash&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;jneidel&lt;/span&gt;&lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="nx"&gt;jneidel&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;de&lt;/span&gt;&lt;span class="err"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;invoices&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;tag:trash&amp;#39;&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="nx"&gt;jneidel&lt;/span&gt;&lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="nx"&gt;jneidel&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;de&lt;/span&gt;&lt;span class="err"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;Trash&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# Test queries with notmuch search&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The &lt;code&gt;Filter&lt;/code&gt;s at the top are used to get mail that I don&amp;rsquo;t want to see out of my
inbox.
Recurring invoices (Telekom) and unsubscribable spam (jobdirecto, bellicon) also get tagged respectively.&lt;/p&gt;
&lt;p&gt;I use the tags &amp;ldquo;spam, trash, archived, invoice&amp;rdquo; and these correspond to
directories in my maildir: &amp;ldquo;spam, Trash, archive, invoices&amp;rdquo;.
The &lt;code&gt;MailMover&lt;/code&gt; at the bottom is responsible for moving mail according to the tags.&lt;/p&gt;
&lt;h2 id="mail-client" class="relative group"&gt;Mail client &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#mail-client" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;I use the notmuch Emacs client.
The Emacs package was already installed alongside the system package:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-elisp" data-lang="elisp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;use-package&lt;/span&gt; &lt;span class="nv"&gt;notmuch&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;:ensure&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;:defer&lt;/span&gt; &lt;span class="no"&gt;t&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;:commands&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;notmuch&lt;/span&gt; &lt;span class="nv"&gt;notmuch-mua-new-mail&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;In the &lt;a href="https://jneidel.com/guide/email-setup/#mail-indexing"&gt;previous section&lt;/a&gt; I already configured notmuch and autotagging with afew.
That means all that is left to configure is the Emacs interface and a little
wiring for persona and &lt;a href="https://jneidel.com/guide/email-setup/#sending-mail"&gt;msmtp&lt;/a&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-elisp" data-lang="elisp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;setq&lt;/span&gt; &lt;span class="nv"&gt;user-mail-address&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;jneidel@jneidel.com&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;user-full-name&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;Jonathan Neidel&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;notmuch-identities&lt;/span&gt; &lt;span class="o"&gt;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Jonathan Neidel &amp;lt;jneidel@jneidel.com&amp;gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;setq&lt;/span&gt; &lt;span class="nv"&gt;send-mail-function&lt;/span&gt; &lt;span class="ss"&gt;&amp;#39;sendmail-send-it&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;message-send-mail-function&lt;/span&gt; &lt;span class="ss"&gt;&amp;#39;sendmail-send-it&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;sendmail-program&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;/bin/msmtp&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;mail-specify-envelope-from&lt;/span&gt; &lt;span class="no"&gt;t&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;message-sendmail-envelope-from&lt;/span&gt; &lt;span class="ss"&gt;&amp;#39;header&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;mail-envelope-from&lt;/span&gt; &lt;span class="ss"&gt;&amp;#39;header&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;setq&lt;/span&gt; &lt;span class="nv"&gt;notmuch-fcc-dirs&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;jneidel@jneidel.de/Sent&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;notmuch-draft-folder&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;jneidel@jneidel.de/Drafts&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;;; paths are relative to notmuch index base root aka the maildir at ~/.local/share/mail&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;I have replaced the default notmuch hello screen with a collection of queries easily accessible through keybindings.
A lot of my this notmuch config this was inspired by &lt;a href="https://protesilaos.com/emacs/dotemacs#h:755e195b-9471-48c7-963b-33055969b4e2" rel="external"&gt;Prots Emacs configuration&lt;/a&gt;.&lt;/p&gt;

 
 
 
 
 
 
 

 
 
 

 
 

 
 
 
 
 
 &lt;figure class="w-9/12 mx-auto my-0 rounded-sm"&gt;
 &lt;img src="./notmuch-hello.png" alt="Notmuch hello screen in Emacs" class="w-9/12 mx-auto my-0 rounded-sm"/&gt;
 &lt;figcaption class="text-center"&gt;The notmuch-hello screen after the below configuration&lt;/figcaption&gt;
 &lt;/figure&gt;


&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-elisp" data-lang="elisp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;use-package&lt;/span&gt; &lt;span class="nv"&gt;notmuch&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;:defer&lt;/span&gt; &lt;span class="no"&gt;t&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;:config&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;setq&lt;/span&gt; &lt;span class="nv"&gt;notmuch-show-logo&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;notmuch-column-control&lt;/span&gt; &lt;span class="mf"&gt;1.0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;notmuch-hello-auto-refresh&lt;/span&gt; &lt;span class="no"&gt;t&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;notmuch-hello-thousands-separator&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;notmuch-hello-sections&lt;/span&gt; &lt;span class="o"&gt;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;notmuch-hello-insert-saved-searches&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;notmuch-search-oldest-first&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;setq&lt;/span&gt; &lt;span class="nv"&gt;notmuch-show-empty-saved-searches&lt;/span&gt; &lt;span class="no"&gt;t&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;setq&lt;/span&gt; &lt;span class="nv"&gt;notmuch-saved-searches&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;`&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt; &lt;span class="nb"&gt;:name&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;📥 inbox&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;:query&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;tag:inbox&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;:sort-order&lt;/span&gt; &lt;span class="nv"&gt;newest-first&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;:key&lt;/span&gt; &lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;kbd&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;i&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="nb"&gt;:name&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;👀 all unread (inbox)&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;:query&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;tag:unread and tag:inbox&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;:sort-order&lt;/span&gt; &lt;span class="nv"&gt;newest-first&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;:key&lt;/span&gt; &lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;kbd&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;u&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="nb"&gt;:name&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;✏️ drafts&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;:query&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;tag:draft and not:tag:trash&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;:sort-order&lt;/span&gt; &lt;span class="nv"&gt;newest-first&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;:key&lt;/span&gt; &lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;kbd&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;d&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="nb"&gt;:name&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;🗃️ archive&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;:query&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;tag:archived&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;:sort-order&lt;/span&gt; &lt;span class="nv"&gt;newest-first&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;:key&lt;/span&gt; &lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;kbd&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;a&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="nb"&gt;:name&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;🛒 invoices&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;:query&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;tag:invoice&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;:sort-order&lt;/span&gt; &lt;span class="nv"&gt;newest-first&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;:key&lt;/span&gt; &lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;kbd&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;n&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="nb"&gt;:name&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;📨 sent&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;:query&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;tag:sent&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;:sort-order&lt;/span&gt; &lt;span class="nv"&gt;newest-first&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;:key&lt;/span&gt; &lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;kbd&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;s&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="nb"&gt;:name&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;🪓 spam&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;:query&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;tag:spam and not:tag:trash&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;:sort-order&lt;/span&gt; &lt;span class="nv"&gt;newest-first&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;:key&lt;/span&gt; &lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;kbd&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;m&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="nb"&gt;:name&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;🗑️ trash&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;:query&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;tag:trash&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;:sort-order&lt;/span&gt; &lt;span class="nv"&gt;newest-first&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;:key&lt;/span&gt; &lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;kbd&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;t&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="nb"&gt;:name&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;🌍 all&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;:query&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;not:tag:trash and not:tag:spam&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;:sort-order&lt;/span&gt; &lt;span class="nv"&gt;newest-first&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;:key&lt;/span&gt; &lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;kbd&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;A&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;keymap-set&lt;/span&gt; &lt;span class="nv"&gt;notmuch-common-keymap&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;kbd&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;g&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nf"&gt;#&amp;#39;&lt;/span&gt;&lt;span class="nv"&gt;notmuch-jump-search&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The interface shows each emails tags.
To make these less verbose and easy to parse I turn them into emoji.
This snippet configures everthing around tags.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-elisp" data-lang="elisp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;use-package&lt;/span&gt; &lt;span class="nv"&gt;notmuch&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;:defer&lt;/span&gt; &lt;span class="no"&gt;t&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;:config&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;setq&lt;/span&gt; &lt;span class="nv"&gt;notmuch-archive-tags&lt;/span&gt; &lt;span class="o"&gt;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;+archived&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;notmuch-message-replied-tags&lt;/span&gt; &lt;span class="o"&gt;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;+replied&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;notmuch-message-forwarded-tags&lt;/span&gt; &lt;span class="o"&gt;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;+forwarded&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;notmuch-show-mark-read-tags&lt;/span&gt; &lt;span class="o"&gt;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;-unread&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;notmuch-draft-tags&lt;/span&gt; &lt;span class="o"&gt;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;+draft&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;notmuch-draft-save-plaintext&lt;/span&gt; &lt;span class="ss"&gt;&amp;#39;ask&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;setq&lt;/span&gt; &lt;span class="nv"&gt;notmuch-tag-formats&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;unread&amp;#34;&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;👀&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;attachment&amp;#34;&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;📎&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;signed&amp;#34;&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;🔑&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;encrypted&amp;#34;&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;🔒&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;replied&amp;#34;&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;💬&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;forwarded&amp;#34;&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;⏩&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;sent&amp;#34;&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;📨&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;inbox&amp;#34;&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;📥&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;spam&amp;#34;&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;🪓&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;invoice&amp;#34;&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;🛒&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;archived&amp;#34;&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;🗃️&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;draft&amp;#34;&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;✏️&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;trash&amp;#34;&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;🗑️&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;lists&amp;#34;&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;📜lists&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;flag&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;propertize&lt;/span&gt; &lt;span class="nv"&gt;tag&lt;/span&gt; &lt;span class="ss"&gt;&amp;#39;face&lt;/span&gt; &lt;span class="ss"&gt;&amp;#39;notmuch-tag-flagged&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;concat&lt;/span&gt; &lt;span class="nv"&gt;tag&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;🚩&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;notmuch-tag-deleted-formats&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;unread&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;notmuch-apply-face&lt;/span&gt; &lt;span class="nv"&gt;bare-tag&lt;/span&gt; &lt;span class="ss"&gt;&amp;#39;notmuch-tag-deleted&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;concat&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;👀&amp;#34;&lt;/span&gt; &lt;span class="nv"&gt;tag&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;.*&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;notmuch-apply-face&lt;/span&gt; &lt;span class="nv"&gt;tag&lt;/span&gt; &lt;span class="ss"&gt;&amp;#39;notmuch-tag-deleted&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;concat&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;🚫&amp;#34;&lt;/span&gt; &lt;span class="nv"&gt;tag&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;notmuch-tag-added-formats&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;del&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;notmuch-apply-face&lt;/span&gt; &lt;span class="nv"&gt;tag&lt;/span&gt; &lt;span class="ss"&gt;&amp;#39;notmuch-tag-added&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;concat&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;💥&amp;#34;&lt;/span&gt; &lt;span class="nv"&gt;tag&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;.*&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;notmuch-apply-face&lt;/span&gt; &lt;span class="nv"&gt;tag&lt;/span&gt; &lt;span class="ss"&gt;&amp;#39;notmuch-tag-added&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;concat&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;🏷️&amp;#34;&lt;/span&gt; &lt;span class="nv"&gt;tag&lt;/span&gt;&lt;span class="p"&gt;))))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;setq&lt;/span&gt; &lt;span class="nv"&gt;notmuch-tagging-keys&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;`&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;kbd&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;d&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;+trash&amp;#34;&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;-inbox&amp;#34;&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;-unread&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;🗑️ Mark for deletion&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;kbd&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;s&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;+spam&amp;#34;&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;-inbox&amp;#34;&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;-unread&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;🪓 Mark as spam&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;kbd&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;f&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;+flag&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;🚩 Flag as important&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;kbd&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;i&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;+invoice&amp;#34;&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;-inbox&amp;#34;&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;-unread&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;🛒 Mark as invoice&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;kbd&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;a&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;+archived&amp;#34;&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;-inbox&amp;#34;&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;-unread&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;🗃️ Mark as archived&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;kbd&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;r&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;-unread&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;👀 Mark as read&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;kbd&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;u&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;+unread&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;👀 Mark as unread&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;keymap-set&lt;/span&gt; &lt;span class="nv"&gt;notmuch-common-keymap&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;kbd&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;u&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nf"&gt;#&amp;#39;&lt;/span&gt;&lt;span class="nv"&gt;notmuch-tag-undo&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;defun&lt;/span&gt; &lt;span class="nv"&gt;notmuch-search-mode-delete-goto-next&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s"&gt;&amp;#34;Tag current mail as trash and move to the next.&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;interactive&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;notmuch-search-tag&lt;/span&gt; &lt;span class="o"&gt;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;+trash&amp;#34;&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;-unread&amp;#34;&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;-inbox&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;forward-line&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;defun&lt;/span&gt; &lt;span class="nv"&gt;notmuch-show-mode-delete-goto-next&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s"&gt;&amp;#34;Tag current mail as trash and move to the next.&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;interactive&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;notmuch-show-tag&lt;/span&gt; &lt;span class="o"&gt;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;+trash&amp;#34;&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;-unread&amp;#34;&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;-inbox&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;notmuch-show-next-message&lt;/span&gt; &lt;span class="no"&gt;t&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;notmuch-search-show-thread&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;keymap-set&lt;/span&gt; &lt;span class="nv"&gt;notmuch-search-mode-map&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;kbd&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;d&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nf"&gt;#&amp;#39;&lt;/span&gt;&lt;span class="nv"&gt;notmuch-search-mode-delete-goto-next&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;keymap-set&lt;/span&gt; &lt;span class="nv"&gt;notmuch-show-mode-map&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;kbd&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;d&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nf"&gt;#&amp;#39;&lt;/span&gt;&lt;span class="nv"&gt;notmuch-show-mode-delete-goto-next&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Often times I want to open a HTML email in the browser.
That needs an entry in &lt;code&gt;~/.mailcap&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-txt" data-lang="txt"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;text/html; brave %s; nametemplate=%s.html
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;I added a wrapper around the native &lt;code&gt;notmuch-show-view-part&lt;/code&gt; so it does what I
want from opening email in the browser:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-elisp" data-lang="elisp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;defun&lt;/span&gt; &lt;span class="nv"&gt;notmuch-show-mode-open-html&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s"&gt;&amp;#34;Open HTML part of message in browser (via ~/.mailcap).&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;interactive&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;save-excursion&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;notmuch-show-previous-message&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;condition-case&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;search-forward&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;text/html&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ne"&gt;error&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;message&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;No HTML part.&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;:success&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;notmuch-show-view-part&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;shell-command&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;open-i3-workspace 2&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;message&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;Opened HTML in browser&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;))))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;defun&lt;/span&gt; &lt;span class="nv"&gt;notmuch-search-mode-open-html&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s"&gt;&amp;#34;Open HTML part of message in browser (via ~/.mailcap).&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;interactive&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;save-excursion&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;notmuch-search-show-thread&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;notmuch-show-previous-message&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;condition-case&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;search-forward&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;text/html&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ne"&gt;error&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;message&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;No HTML part.&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;:success&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;notmuch-show-view-part&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;shell-command&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;open-i3-workspace 2&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;message&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;Opened HTML in browser&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;))))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;keymap-set&lt;/span&gt; &lt;span class="nv"&gt;notmuch-search-mode-map&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;kbd&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;o&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nf"&gt;#&amp;#39;&lt;/span&gt;&lt;span class="nv"&gt;notmuch-search-mode-open-html&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;keymap-set&lt;/span&gt; &lt;span class="nv"&gt;notmuch-show-mode-map&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;kbd&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;o&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nf"&gt;#&amp;#39;&lt;/span&gt;&lt;span class="nv"&gt;notmuch-show-mode-open-html&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Mutt has an option called &lt;code&gt;reverse_name&lt;/code&gt;.
If activated the &lt;em&gt;From:&lt;/em&gt; line in a reply will be built using the address the
message was originally sent &lt;em&gt;To:&lt;/em&gt;.
If somebody writes me an email to &amp;ldquo;&lt;a href="mailto:hi@jneidel.com" rel="external"&gt;hi@jneidel.com&lt;/a&gt;&amp;rdquo;, I want to answer from
&amp;ldquo;&lt;a href="mailto:hi@jneidel.com" rel="external"&gt;hi@jneidel.com&lt;/a&gt;&amp;rdquo;, even though &amp;ldquo;&lt;a href="mailto:jneidel@jneidel.de" rel="external"&gt;jneidel@jneidel.de&lt;/a&gt;&amp;rdquo; is my configured as my default sender.
The code below does exactly that.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-elisp" data-lang="elisp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;use-package&lt;/span&gt; &lt;span class="nv"&gt;notmuch&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;:defer&lt;/span&gt; &lt;span class="no"&gt;t&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;:config&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;defun&lt;/span&gt; &lt;span class="nv"&gt;notmuch--get-message-to&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s"&gt;&amp;#34;Return the raw To: header of the message or nil.&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;let&lt;/span&gt; &lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nv"&gt;message-properties&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;cond&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nv"&gt;derived-mode-p&lt;/span&gt; &lt;span class="ss"&gt;&amp;#39;notmuch-show-mode&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;notmuch-show-get-message-properties&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nv"&gt;derived-mode-p&lt;/span&gt; &lt;span class="ss"&gt;&amp;#39;notmuch-search-mode&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;notmuch-search-show-thread&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;notmuch-show-get-message-properties&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nv"&gt;derived-mode-p&lt;/span&gt; &lt;span class="ss"&gt;&amp;#39;notmuch-tree-mode&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;notmuch-tree-get-message-properties&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="no"&gt;t&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt;&lt;span class="p"&gt;))))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;eq&lt;/span&gt; &lt;span class="nv"&gt;message-properties&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="no"&gt;nil&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;plist-get&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;plist-get&lt;/span&gt; &lt;span class="nv"&gt;message-properties&lt;/span&gt; &lt;span class="nb"&gt;:headers&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nb"&gt;:To&lt;/span&gt;&lt;span class="p"&gt;))))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;defun&lt;/span&gt; &lt;span class="nv"&gt;notmuch-reply-reverse-name-advice&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;orig-fn&lt;/span&gt; &lt;span class="kp"&gt;&amp;amp;rest&lt;/span&gt; &lt;span class="nv"&gt;args&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s"&gt;&amp;#34;Advice &amp;#39;notmuch-mua-reply&amp;#39; to use the original To: addresses as the From:.&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;let&lt;/span&gt; &lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nv"&gt;to-address&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;notmuch--get-message-to&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;apply&lt;/span&gt; &lt;span class="nv"&gt;orig-fn&lt;/span&gt; &lt;span class="nv"&gt;args&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;when&lt;/span&gt; &lt;span class="nv"&gt;to-address&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;message-replace-header&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;From&amp;#34;&lt;/span&gt; &lt;span class="nv"&gt;to-address&lt;/span&gt;&lt;span class="p"&gt;))))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;advice-add&lt;/span&gt; &lt;span class="ss"&gt;&amp;#39;notmuch-mua-reply&lt;/span&gt; &lt;span class="nb"&gt;:around&lt;/span&gt; &lt;span class="nf"&gt;#&amp;#39;&lt;/span&gt;&lt;span class="nv"&gt;notmuch-reply-reverse-name-advice&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;One of the killer feature of having email in Emacs is being able to reference an email
with a clickable link from org-mode files.
This is achieved using &lt;a href="https://github.com/tarsius/ol-notmuch" rel="external"&gt;ol-notmuch&lt;/a&gt;.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-elisp" data-lang="elisp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;use-package&lt;/span&gt; &lt;span class="nv"&gt;ol-notmuch&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;:bind&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;C-c l&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="nv"&gt;org-store-link&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Oftentimes PDFs are attached to incoming mail.
By default these would need to be manually saved and then opened.
This script extracts the text data from the PDF attachment and pops it into a new buffer (&lt;a href="https://notmuchmail.org/emacstips/#index1h2" rel="external"&gt;source&lt;/a&gt;).&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-elisp" data-lang="elisp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;defun&lt;/span&gt; &lt;span class="nv"&gt;user/mm-pipe--&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;handle&lt;/span&gt; &lt;span class="nv"&gt;cmd&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;;; conveniently, &amp;#39;-&amp;#39; &amp;#39;-&amp;#39; a args to pdftotext and docx2txt.pl work fine&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;;; fixme: naming inconsistency (fn name and buffer name)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;let&lt;/span&gt; &lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nv"&gt;buffer&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;get-buffer-create&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;*attachment-to-text*&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;with-current-buffer&lt;/span&gt; &lt;span class="nv"&gt;buffer&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;setq&lt;/span&gt; &lt;span class="nv"&gt;buffer-read-only&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;erase-buffer&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;with-temp-buffer&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;;; &amp;#34;based on mm-pipe-part in mm-decode.el&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;mm-with-unibyte-buffer&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;mm-insert-part&lt;/span&gt; &lt;span class="nv"&gt;handle&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;mm-add-meta-html-tag&lt;/span&gt; &lt;span class="nv"&gt;handle&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;let&lt;/span&gt; &lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nv"&gt;coding-system-for-write&lt;/span&gt; &lt;span class="ss"&gt;&amp;#39;binary&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;call-process-region&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;point-min&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;point-max&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;cmd&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt; &lt;span class="nv"&gt;buffer&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;-&amp;#34;&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;-&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;))))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;pop-to-buffer&lt;/span&gt; &lt;span class="nv"&gt;buffer&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;goto-char&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;point-min&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;text-mode&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;visual-line-mode&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;view-mode&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;defun&lt;/span&gt; &lt;span class="nv"&gt;user/notmuch-show-pop-attachment-to-buffer&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;;; &amp;#34;based on notmuch-show-apply-to-current-part-handle&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;interactive&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;let&lt;/span&gt; &lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nv"&gt;handle&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;notmuch-show-current-part-handle&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;;;(message &amp;#34;%s&amp;#34; handle)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;unwind-protect&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;pcase&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;car&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;nth&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="nv"&gt;handle&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;application/pdf&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;user/mm-pipe--&lt;/span&gt; &lt;span class="nv"&gt;handle&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;pdftotext&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;application/vnd.openxmlformats-officedocument.wordprocessingml.document&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;user/mm-pipe--&lt;/span&gt; &lt;span class="nv"&gt;handle&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;docx2txt.pl&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;_&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;notmuch-show-save-part&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;kill-buffer&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;mm-handle-buffer&lt;/span&gt; &lt;span class="nv"&gt;handle&lt;/span&gt;&lt;span class="p"&gt;)))))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;setq&lt;/span&gt; &lt;span class="nv"&gt;notmuch-show-part-button-default-action&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;#&amp;#39;&lt;/span&gt;&lt;span class="nv"&gt;user/notmuch-show-pop-attachment-to-buffer&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The latest version of my Emacs config (and thus all of the above snippets) can always be found in my &lt;a href="https://github.com/jneidel/dotfiles/blob/master/.emacs.d/dotemacs.org" rel="external"&gt;dotfiles&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id="android-client" class="relative group"&gt;Android client &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#android-client" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h3&gt;&lt;p&gt;For the occasional access on my phone I use &lt;a href="https://f-droid.org/en/packages/com.fsck.k9/" rel="external"&gt;K-9 Mail&lt;/a&gt;.
The same values as in the above &lt;a href="https://jneidel.com/guide/email-setup/#retrival-and-sync"&gt;IMAP&lt;/a&gt; and &lt;a href="https://jneidel.com/guide/email-setup/#sending-mail"&gt;SMTP&lt;/a&gt; sections are used.&lt;/p&gt;
&lt;h2 id="testing" class="relative group"&gt;Testing &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#testing" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;Obviously we need to test that outgoing mail from the different domains are
delivered and that incoming mail arrives, is properly tagged and displayed.&lt;/p&gt;
&lt;p&gt;Uberspaces &lt;a href="https://webmail.uberspace.de/" rel="external"&gt;webmail&lt;/a&gt; can be used for testing if needed.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DKIM&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;To make sure DKIM and SPF are working correctly used &lt;a href="https://dkimvalidator.com/" rel="external"&gt;this website&lt;/a&gt; for testing.&lt;/p&gt;
&lt;h2 id="conclusions" class="relative group"&gt;Conclusions &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#conclusions" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;Email was at first a daunting task because of the many moving parts and the
endless testing on every change.
Once I understood what components I needed and what they were responsible for they were not hard to configure.
I hope you were able to take that understanding away from this.&lt;/p&gt;
&lt;p&gt;Being able to have email in Emacs was definitely worth it to me.
It is now easier than ever to reach inbox zero.&lt;/p&gt;</description></item><item><title>Going vegan</title><link>https://jneidel.com/project/going-vegan/</link><pubDate>Sat, 01 Nov 2025 00:00:00 +0000</pubDate><author>web@jneidel.com (Jonathan Neidel)</author><guid>https://jneidel.com/project/going-vegan/</guid><description>&lt;p&gt;I&amp;rsquo;m not writing this to convince anybody but myself.
I have bad long-term memory.
If I put my decision and the reasons going into it in writing it can help me
sail through future seas of doubt.&lt;/p&gt;
&lt;h2 id="why-vegan" class="relative group"&gt;Why vegan? &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#why-vegan" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;I&amp;rsquo;m not going vegan for the animals.
I&amp;rsquo;m doing it for me.
Animal products are holding me - and humanity as a whole - back.
Physically, ethically and spiritually.&lt;/p&gt;
&lt;h3 id="definition-of-veganism" class="relative group"&gt;Definition of veganism &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#definition-of-veganism" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h3&gt;&lt;p&gt;Being introduced to this definition was what made look into this topic again.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Veganism is a philosophy and way of living which seeks to exclude — &lt;strong&gt;as far as is possible and practicable&lt;/strong&gt; — all forms of exploitation of, and cruelty to, animals for food, clothing or any other purpose - &lt;a href="https://www.vegansociety.com/go-vegan/definition-veganism" rel="external"&gt;Vegan Society&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The highlighted passage is key to me.
&lt;a href="https://www.merriam-webster.com/dictionary/veganism" rel="external"&gt;Other definitions&lt;/a&gt; are black-and-white and insist that absolutely any consumption of animal products is evil.
But peoples bodies are different.
There might be someone who can&amp;rsquo;t live without a particular animal product.
If they reduce the intake to as far as possible, they could be vegan as per this definition.
Even with a non-zero consumption of animal products.
Though it does require sensitivity and honesty with oneself.&lt;/p&gt;
&lt;h2 id="the-physical" class="relative group"&gt;The physical &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#the-physical" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;I&amp;rsquo;m not gonna make any health claims.
Those by themselves did not convince me, no matter how much evidence there was.&lt;/p&gt;
&lt;h3 id="how-it-makes-me-feel" class="relative group"&gt;How it makes me feel &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#how-it-makes-me-feel" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h3&gt;&lt;p&gt;When I started with 100% raw food I found myself going back to cooked
eggs.
Without them I could feel truly satisfied.
My body craved a nutrient it did not know where else to get.
After some reading and experimenting I did not need eggs anymore.
(I needed more green-leafy vegetables. Like way more.
See &lt;cite&gt;Sunfood Diet Success System&lt;/cite&gt; and it&amp;rsquo;s triangle for more info.)&lt;/p&gt;
&lt;p&gt;Fish, eggs and dairy were still an occasional part of my diet at this point.
What I noticed was how different I felt after eating a meal with and without an
animal product.
It was always noticeably worse.
I had acquired a sensitivity I did not previously possess and I could clearly
sense that I was better off without animal products and gluten.&lt;/p&gt;
&lt;h3 id="the-product-itself" class="relative group"&gt;The product itself &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#the-product-itself" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h3&gt;&lt;p&gt;I watched documentaries about the conditions the animal are held in.
Milk cows are standing in their feces.
Even a small cut will become infected in those conditions.
Some infections grow so debilitating that the cow can&amp;rsquo;t walk anymore.
They are isolated and &amp;ldquo;treated&amp;rdquo;, but if it gets worse they go off to the
slaughterhouse.
Still good enough for ground meat:yum:
A lion would never go after an animal like that.
That is tainted meat.
The contaminated milk from puss-ridden utters is not any better.&lt;/p&gt;
&lt;p&gt;&amp;ldquo;You are what you eat&amp;rdquo; and what the factory-farmed animal eats is the cheapest,
pesticide-riddled, GMO-modified, unnatural (for their species) feed that big
industry can get their hands on.
The end product is of such low nutritional quality that the animal needs to be
fed vitamin B12 supplements for the meat to contain any.
That&amp;rsquo;s why meat eater in the know will insist on grass-fed beef.
Otherwise the animals shitty diet end up on ones plate.&lt;/p&gt;
&lt;h2 id="the-ethical" class="relative group"&gt;The ethical &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#the-ethical" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=_K36Zu0pA4U" rel="external"&gt;Gary Yourofsky&lt;/a&gt; makes the argument pretty convincingly.
I also find that the pictures rationally examined speak for themselves.
Most of these animal live their whole lives in conditions that would classify as
torture if they were applied to humans (constant stress, noise and light = sleep
deprivation, no sun or fresh air ever, not being able to turn around, sleeping in your
own feces and lots more as allowed by your local regulations!)&lt;/p&gt;
&lt;p&gt;The milk cows have it especially bad.
They are doing 3-7 years of torture, with a sprinkle of the the regular rape plus having their children ripped away from them.
At least for the rotisserie chicken it&amp;rsquo;s over after a month.
Vegetarianism is not the answer to those cows prayers.&lt;/p&gt;
&lt;h2 id="the-spiritual" class="relative group"&gt;The spiritual &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#the-spiritual" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;This one is hard to explain.
If you have not experienced this it might be hard to imagine.
You really appreciate it if you have it though.&lt;/p&gt;
&lt;p&gt;For me, it&amp;rsquo;s easier to feel things, I have a greater sensitivity in many
regards.
Connectedness to myself, my wife and the universe comes easier.
Less ego and worldly attachment.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Every man who has ever been earnest to preserve his higher poetic faculties in the best condition,
has been particularly inclined to abstain from animal food, or from much food of
any kind. - &lt;cite&gt;Henry David Thoreau in Walden&lt;/cite&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="conclusion" class="relative group"&gt;Conclusion &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#conclusion" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;With this transition away from animal products I feel better for it physically,
ethically and spiritually.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;I felt secure having experienced that all my nutritional needs could be met without animal foods.&lt;/li&gt;
&lt;li&gt;I felt motivated by feeling physically better without them.&lt;/li&gt;
&lt;li&gt;I felt ashamed for the extent of humanities unconsciousness as manifested in this torture apparatus.&lt;/li&gt;
&lt;li&gt;I felt drawn by the spiritual openness it afforded me.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;After eating raw previously it was not hard to switch and seemed the logical next step.&lt;/p&gt;
&lt;h2 id="references" class="relative group"&gt;References &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#references" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=_K36Zu0pA4U" rel="external"&gt;Best Speech You Will Ever Hear - Gary Yourofsky&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;:de:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=5a_7i-VGMxU" rel="external"&gt;Was 9 Jahre als Veganer wirklich mit mir gemacht haben 🥕 Selbstexperiment&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=L4XFCuFbiOY" rel="external"&gt;Die Realität der Schweine&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=B_pHcBfb0Go" rel="external"&gt;Die Realität der Milchkühe&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=M7KuFJEO7sI" rel="external"&gt;Die Realität der Fische&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Letting Go</title><link>https://jneidel.com/essay/letting-go/</link><pubDate>Tue, 05 Aug 2025 00:00:00 +0000</pubDate><author>web@jneidel.com (Jonathan Neidel)</author><guid>https://jneidel.com/essay/letting-go/</guid><description>&lt;p&gt;I have been letting go.&lt;/p&gt;
&lt;p&gt;It was obvious in some ways.
I donated clothes I did not wear and books I will not read.&lt;/p&gt;
&lt;p&gt;It was more subtle in other ways.
Along with the books I let go of the person I thought I was going to be.
The person who would read those books.
Letting them go was letting go of this hypothetical future me.
That&amp;rsquo;s why it was so hard to do.
I had hung onto that &lt;em&gt;me&lt;/em&gt; for years (in the form of those books.)&lt;/p&gt;
&lt;p&gt;I let go of my goals.
Of the idea that I should control where my life is headed.
I never could control that in the first place.
That&amp;rsquo;s not to say that I won&amp;rsquo;t take the initiative to make things happen.
I will and do.
I just don&amp;rsquo;t weave my actions into a story, a grand vision of who I will become.
I just am.
I don&amp;rsquo;t live to labor in service of an imagined future.
I enjoy the present.
What ever it may hold for me.&lt;/p&gt;
&lt;p&gt;I let go of my identity.
Who is Jonathan?
I am not my past.
The past is behind me.
I am not my future.
The future is not real.
I am not my physical body.
Within 6 months every single cell of my body will have renewed itself.
No piece of my current body will remain.
I am not my thoughts and opinions.
An identity created out of them would be a false and hollow one.
A prison.&lt;/p&gt;
&lt;p&gt;How can you &amp;ldquo;change your mind&amp;rdquo; if you &lt;em&gt;are&lt;/em&gt; your opinions?
Isn&amp;rsquo;t that why so many people are so unwilling to change their mind?
It&amp;rsquo;s not that they don&amp;rsquo;t want to, they can&amp;rsquo;t.
They defend their position, because they are their position.
It&amp;rsquo;s self-defense.
Arguments can&amp;rsquo;t convince them, which you know if you have argued with people
like that.
I would know.
I was like that.
But now I&amp;rsquo;m free!!!
Is how my thoughts are trying to continue my story.
&amp;ldquo;From that moment on, my life was different.
I had found the truth.
I had achieved enlightenment.&amp;rdquo;
Real shit.
I had those thoughts.
But they&amp;rsquo;re just thoughts.
They are not me.&lt;/p&gt;</description></item><item><title>Why do aliens matter?</title><link>https://jneidel.com/essay/aliens-significance/</link><pubDate>Wed, 22 Jan 2025 00:00:00 +0000</pubDate><author>web@jneidel.com (Jonathan Neidel)</author><guid>https://jneidel.com/essay/aliens-significance/</guid><description>&lt;p class="dropcap"&gt;Aliens challenge our western worldview.
One dominated by a science based in the material world.
What lies beyond our senses is disregarded.
If you can&amp;rsquo;t see, touch, feel, hear or smell it, it&amp;rsquo;s not &lt;em&gt;real&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;There is some physical evidence to the phenomenon of alien abductions.
Enough to win over those who are prepared to believe.
But not enough to convince the skeptic.
As if the intelligence at work here was trying to trick and deceive the
investigators.
That might be on purpose.
It&amp;rsquo;s as if the phenomenon was inviting us to change our ways, to expand
our consciousness and ways of learning.
A challenge to adapt our conventional ways of knowing and observing, to
find methodologies more appropriate to its own subtle, complex, and perhaps
ultimately unknowable nature.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;They&lt;/em&gt; are not of this world.
Why do we demand that our worldly thinking applies?
Our methods are insufficient to measure and evaluate phenomena that originate
in the unseen spirit world and cross over to manifest in the material world.
If you treat aliens and similar phenomena literally, you miss the message.
The medium &lt;em&gt;is&lt;/em&gt; the message.&lt;/p&gt;
&lt;p&gt;I don&amp;rsquo;t care about aliens or answering the question &amp;ldquo;Are &lt;em&gt;they&lt;/em&gt; real?&amp;rdquo;
I care about people;
The profound effect an alien abduction on had the people, who believe it
happened to them –
how it dramatically altered their lives for the better –
and the effect that investigating this phenomenon had on me.
It has compelled me to elevate my consciousness and to fight for and look
after our planet.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;For your study&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;If you want to look into the topic yourself, I would recommend John Mack.
He has a sober, scientific style and approaches the material with an open
mind, but not as a true believer.
A &lt;a href="https://www.youtube.com/watch?v=L9SJUowifik" rel="external"&gt;primer&lt;/a&gt;.
His work &lt;a href="https://amzn.to/40F2YQ1" rel="external"&gt;&lt;cite&gt;Abductions&lt;/cite&gt;&lt;/a&gt; details the raw experiences of Abductees.
In &lt;a href="https://amzn.to/3Chw9PS" rel="external"&gt;&lt;cite&gt;Passport to the Cosmos&lt;/cite&gt;&lt;/a&gt; he describes the themes that continuously come up in abductions.&lt;/p&gt;
&lt;p&gt;There is also Ufology, the study of the UFO Phenomenon.
In comparison I see these insights to be gained:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Ufology&lt;/strong&gt;: &lt;em&gt;they&lt;/em&gt; are here&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Alien abductions&lt;/strong&gt;: &lt;em&gt;they&lt;/em&gt; are here and this is what &lt;em&gt;they&lt;/em&gt; want&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ufology lacks the transformative potential for the individual and is
dominated by the distracting narrative that &amp;ldquo;the government is lying to us.&amp;rdquo;
What it is good for, is to give you some evidence to the point that &amp;ldquo;&lt;em&gt;they&lt;/em&gt;
are here.&amp;rdquo;
Start with the documentary &lt;a href="https://www.imdb.com/title/tt13095604" rel="external"&gt;&lt;cite&gt;The Phenomenon&lt;/cite&gt;&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>Becoming profitable at Day Trading</title><link>https://jneidel.com/project/day-trading/</link><pubDate>Sun, 08 Dec 2024 00:00:00 +0000</pubDate><author>web@jneidel.com (Jonathan Neidel)</author><guid>https://jneidel.com/project/day-trading/</guid><description>&lt;blockquote&gt;
&lt;p&gt;Becoming a better human being will make you a better trader.&lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="what" class="relative group"&gt;What? &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#what" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;Day trading is sitting in front of a lower time frame chart (5 mins, 15
mins) and speculating on what is unfolding in front of you.
Positions are only held for the duration of the trading session.&lt;/p&gt;
&lt;h3 id="goal" class="relative group"&gt;Goal &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#goal" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;Be profitable.&lt;/li&gt;
&lt;li&gt;Continuously increase the stake size (risk per point of movement in the
underlying) up to 50€&lt;sup id="fnref:2"&gt;&lt;a href="#fn:2" class="footnote-ref" role="doc-noteref"&gt;2&lt;/a&gt;&lt;/sup&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="why" class="relative group"&gt;Why? &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#why" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;What about day trading sparked my interest?
Why did I commit to this project?&lt;/p&gt;
&lt;h3 id="from-no-to-thinking_face" class="relative group"&gt;From No to :thinking_face: &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#from-no-to-thinking_face" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h3&gt;&lt;p&gt;I had seriously considered day trading one year ago.
I gave it a hard No.
My aim is financial independence, not another job.
I don&amp;rsquo;t want to sit in front of the chart all day, being restricted in my
when and where.
Case closed.&lt;/p&gt;
&lt;p&gt;I still wanted trade with my money for some above average returns, but on a
small time budget.
That story is detailed &lt;a href="https://jneidel.com/de/project/b%C3%B6rsenstrategie/"&gt;here&lt;/a&gt;&lt;sup&gt;
 &lt;abbr class="no-underline" title="The linked article is in German."&gt;:de:&lt;/abbr&gt;
&lt;/sup&gt;
.
As part of that I came across &lt;cite&gt;&lt;a href="https://amzn.to/41c9VsE" rel="external"&gt;Best Loser Wins&lt;/a&gt;&lt;/cite&gt;&lt;sup id="fnref:3"&gt;&lt;a href="#fn:3" class="footnote-ref" role="doc-noteref"&gt;3&lt;/a&gt;&lt;/sup&gt;.
This quote caught my attention while reading:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Perhaps it is time to acknowledge trading for what it is?
&lt;strong&gt;It is a great way to expose all your flaws.&lt;/strong&gt;
It is a great way to highlight your strengths.
Through my trading and my research, I have uncovered weaknesses in my
character.&lt;/p&gt;
&lt;p&gt;For me, the side benefit of earning a living from trading the financial
markets is the character traits it instils in me.
I am more patient than ever.
I am much more focused and disciplined than I was before.
– Tom Hougaard&lt;sup id="fnref1:3"&gt;&lt;a href="#fn:3" class="footnote-ref" role="doc-noteref"&gt;3&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Now it&amp;rsquo;s starting to sound interesting.&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;More about the mental game of trading&lt;/summary&gt;
&lt;p&gt;Success at trading is a mostly about mindset.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I always say that you could publish trading rules in the newspaper and no
one would follow them.
The key is consistency and discipline.
[..] the confidence to stick to those rules even when things are going bad.&lt;sup id="fnref:4"&gt;&lt;a href="#fn:4" class="footnote-ref" role="doc-noteref"&gt;4&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The markets pose many challenges that need to be dealt with on a mental
level:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Can you be calm and objective with a significant amount of money on the line?&lt;/li&gt;
&lt;li&gt;Can you withstand the fear to get out and play it by the rules?&lt;/li&gt;
&lt;li&gt;Do you have the patience to ride it out, to sight tight?&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;the ultimate test is the “belly test”.
&lt;strong&gt;Can your belly handle the drawdowns?&lt;/strong&gt;
Are you willing to experience these feelings?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/details&gt;
&lt;h3 id="more-clues" class="relative group"&gt;More clues &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#more-clues" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h3&gt;&lt;p&gt;At first I dismissed the idea.
&amp;ldquo;I don&amp;rsquo;t want to be a day trader.&amp;rdquo;
I said.
But the idea kept coming back to me: &amp;ldquo;This vision of day trading has
potential.&amp;rdquo;&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;I started to recognize aspects in trading I had already worked
on:&lt;/summary&gt;
&lt;ul&gt;
&lt;li&gt;&amp;ldquo;Don&amp;rsquo;t lie to yourself.&amp;rdquo; (Honesty&lt;sup id="fnref:5"&gt;&lt;a href="#fn:5" class="footnote-ref" role="doc-noteref"&gt;5&lt;/a&gt;&lt;/sup&gt;)&lt;/li&gt;
&lt;li&gt;You need to &lt;a href="https://jneidel.com/essay/no-interrupting/"&gt;listen&lt;/a&gt; to the market and view it objectively.&lt;/li&gt;
&lt;li&gt;Failure is inevitable. It&amp;rsquo;s part of the process. It should be embraced.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://jneidel.com/misc/what-is-nlp/"&gt;Effectively changing my beliefs and subconscious reactions&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;The importance of &lt;em&gt;principles&lt;/em&gt; like &amp;ldquo;Ride winners, cut losers&amp;rdquo;, Always use
stops, &amp;ldquo;Plan your trade, trade your plan&amp;rdquo;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These next two quotes strongly reminded me of &lt;cite&gt;&lt;a href="https://amzn.to/3B7FYPX" rel="external"&gt;The Power of Now&lt;/a&gt;&lt;/cite&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;In the past I was so preoccupied with what should happen.
But to make money we must be focused on what is happening &lt;strong&gt;right here, right now&lt;/strong&gt;.&lt;sup id="fnref2:3"&gt;&lt;a href="#fn:3" class="footnote-ref" role="doc-noteref"&gt;3&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;I think you are trading yesterday&amp;rsquo;s experience.
You haven&amp;rsquo;t wiped the mind-slate clean.
&lt;strong&gt;You are not present.&lt;/strong&gt;
You are focused on the past.&lt;sup id="fnref3:3"&gt;&lt;a href="#fn:3" class="footnote-ref" role="doc-noteref"&gt;3&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/details&gt;
&lt;p&gt;Maybe trading, adapted to my style, would not be such a
bad fit after all.&lt;/p&gt;
&lt;h3 id="my-decision" class="relative group"&gt;My decision &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#my-decision" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h3&gt;&lt;p&gt;I was hesitant to decide.
Is this what I really want?
Am I willing to put in the effort to make this work?&lt;/p&gt;
&lt;p&gt;A decision carries with it the heavy responsibility to follow through.
To not let up.
To take the small steps that will get you there.
To not be deterred by temporary setbacks.&lt;/p&gt;
&lt;p&gt;I am very drawn to everything this project entails.
In the end, the decision did not take long.
My gut tells me that this is the way for me.
I believe this is the best thing I can do for the world and other
people.&lt;sup id="fnref:6"&gt;&lt;a href="#fn:6" class="footnote-ref" role="doc-noteref"&gt;6&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;p&gt;I know this is a though project.
That it entails a ton of work.
I&amp;rsquo;m all for it.
Not because it is easy, but because it is hard.&lt;/p&gt;
&lt;h3 id="why-specifically" class="relative group"&gt;Why specifically? &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#why-specifically" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h3&gt;&lt;p&gt;&amp;ldquo;Just give me a concise list of reasons.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;In order of importance:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;It provides me with a challenge that allows me to perpetually expand my
comfort zone.
(By continuously increasing the stakes to make it less comfortable for
myself.)&lt;/li&gt;
&lt;li&gt;There is much I can learn about myself in the markets, if I pay close
attention.&lt;/li&gt;
&lt;li&gt;Trading is fun.&lt;/li&gt;
&lt;li&gt;Money also.
Financial independence has always been one of the broader goal I&amp;rsquo;m working
towards.
I&amp;rsquo;d be nice if this gets me there or closer to it, but I&amp;rsquo;m not expecting
anything.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="how" class="relative group"&gt;How? &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#how" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;I&amp;rsquo;m starting with Toms&lt;sup id="fnref4:3"&gt;&lt;a href="#fn:3" class="footnote-ref" role="doc-noteref"&gt;3&lt;/a&gt;&lt;/sup&gt; strategies and will slowly make them my
own over time.&lt;/p&gt;
&lt;p&gt;This is what I will do (ordered by the amount of time allotted):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Research and deliberate practice: get better with the strategies at a
technical level&lt;/li&gt;
&lt;li&gt;Trade: observe and review my strategies in action and the feelings they
generate&lt;/li&gt;
&lt;li&gt;Internal analysis: reflect and correct my behavioral responses&lt;/li&gt;
&lt;li&gt;Produce output: share my research, learnings and progress&lt;/li&gt;
&lt;li&gt;Distill and internalize trading principles&lt;/li&gt;
&lt;li&gt;Improve my trading journal (it&amp;rsquo;s already pretty decent at this point)&lt;/li&gt;
&lt;li&gt;Study price action&lt;/li&gt;
&lt;li&gt;Consume relevant input (books, podcast, course)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This is an &lt;a href="https://jneidel.com/project-status/ongoing/"&gt;ongoing project&lt;/a&gt; and will be updated
over time.
More frequent updates can be found in the newsletter:&lt;/p&gt;
&lt;div class="footnotes" role="doc-endnotes"&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id="fn:1"&gt;
&lt;p&gt;From a talk by Tom Hougaard (Author of &lt;cite&gt;&lt;a href="https://amzn.to/41c9VsE" rel="external"&gt;Best Loser Wins&lt;/a&gt;&lt;/cite&gt;&lt;sup id="fnref5:3"&gt;&lt;a href="#fn:3" class="footnote-ref" role="doc-noteref"&gt;3&lt;/a&gt;&lt;/sup&gt;): &lt;a href="https://tradertom.com/resource/download-handout-notes/" rel="external"&gt;The ideal trading mindset&lt;/a&gt;&amp;#160;&lt;a href="#fnref:1" class="footnote-backref" role="doc-backlink"&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:2"&gt;
&lt;p&gt;I realize this is a huge stake size and that I will have to
build up a great level of confidence and capital to swing this big.
I would rather aim way high and only get half-way there than setting a more
realistic 10€.
If you don&amp;rsquo;t comprehend why this is a large stake size: with a stop loss 20
points away, one has 1.000€ at risk.&amp;#160;&lt;a href="#fnref:2" class="footnote-backref" role="doc-backlink"&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:3"&gt;
&lt;p&gt;&lt;cite&gt;&lt;a href="https://amzn.to/41c9VsE" rel="external"&gt;Best Loser Wins&lt;/a&gt; - Tom Hougaard&lt;/cite&gt;:
A book about the mental attitudes required to be a successful trader.
It&amp;rsquo;s the best book on the stock market I&amp;rsquo;ve engaged with so far.
The author is a real one. He knows what he&amp;rsquo;s talking about, is genuine and
he lives what teaches.&amp;#160;&lt;a href="#fnref:3" class="footnote-backref" role="doc-backlink"&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&amp;#160;&lt;a href="#fnref1:3" class="footnote-backref" role="doc-backlink"&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&amp;#160;&lt;a href="#fnref2:3" class="footnote-backref" role="doc-backlink"&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&amp;#160;&lt;a href="#fnref3:3" class="footnote-backref" role="doc-backlink"&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&amp;#160;&lt;a href="#fnref4:3" class="footnote-backref" role="doc-backlink"&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&amp;#160;&lt;a href="#fnref5:3" class="footnote-backref" role="doc-backlink"&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:4"&gt;
&lt;p&gt;Richard Dennis in &lt;cite&gt;&lt;a href="https://amzn.to/3VvdxCh" rel="external"&gt;Market Wizards – Jack D Schwager&lt;/a&gt;&lt;/cite&gt;.&amp;#160;&lt;a href="#fnref:4" class="footnote-backref" role="doc-backlink"&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:5"&gt;
&lt;p&gt;Another quote about honesty in trading I found insightful:&lt;blockquote&gt;
The fruits of your success will be in direct ratio to the honesty and
sincerity of your own effort in keeping your own records, doing your own
thinking, and reaching your own conclusions. – Jesse Livermore&lt;/blockquote&gt;&amp;#160;&lt;a href="#fnref:5" class="footnote-backref" role="doc-backlink"&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:6"&gt;
&lt;p&gt;Eisel Mazard always urges listeners to go out
and attempt to make the world a better place.
I have looked for way that I can do that.
Some way that is right for me.
&lt;br&gt;
&lt;br&gt;
The outcome of my why workshop&lt;sup id="fnref:7"&gt;&lt;a href="#fn:7" class="footnote-ref" role="doc-noteref"&gt;7&lt;/a&gt;&lt;/sup&gt; was: &amp;ldquo;To improve myself, so
that I can best support others.&amp;rdquo;
By improving my personality through trading I will be able to do much more
for other people and the world.
Nowhere am I as driven, as in my self-development.
Harnessing that drive for the betterment of all is how I can make the world
a better place.&amp;#160;&lt;a href="#fnref:6" class="footnote-backref" role="doc-backlink"&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:7"&gt;
&lt;p&gt;See &lt;cite&gt;&lt;a href="https://amzn.to/3Vpd5FO" rel="external"&gt;Find your Why&lt;/a&gt; – Simon Sinek&lt;/cite&gt;&amp;#160;&lt;a href="#fnref:7" class="footnote-backref" role="doc-backlink"&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</description></item><item><title>Naming the Newsletter</title><link>https://jneidel.com/project/naming-the-newsletter/</link><pubDate>Sun, 06 Oct 2024 00:00:00 +0000</pubDate><author>web@jneidel.com (Jonathan Neidel)</author><guid>https://jneidel.com/project/naming-the-newsletter/</guid><description>&lt;h2 id="what" class="relative group"&gt;What? &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#what" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;I needed a name for my newsletter.
It being called &amp;ldquo;Newsletter&amp;rdquo; just wouldn&amp;rsquo;t do.
That &amp;ldquo;name&amp;rdquo; was a relict of &lt;q&gt;Start before you are ready.&lt;/q&gt;&lt;/p&gt;
&lt;h2 id="why" class="relative group"&gt;Why? &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#why" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;blockquote&gt;
&lt;p&gt;Words mean things.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The best names convey an essence of what lay beyond.
&amp;ldquo;The Power of Now&amp;rdquo; is about the energy of the present moment, &amp;ldquo;The 4-Hour
Workweek&amp;rdquo; about the idea that you can work dramatically less, &amp;ldquo;Using your
Brain –– For a change&amp;rdquo; about making your neurology work for you.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&amp;ldquo;Newsletter&amp;rdquo;&lt;/em&gt; is just a category descriptor.
What it conveys is: generic, unoriginal, lazy, etc.&lt;/p&gt;
&lt;p&gt;Simply, a fitting name for my newsletter would improve the perception of is
contained inside.&lt;/p&gt;
&lt;h2 id="how" class="relative group"&gt;How? &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#how" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;I generated 10&lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt; ideas everyday, until I had a good
selection (inspired by James Altuchers &lt;a href="https://jneidel.com/newsletter/becoming-an-idea-machine/#next-challenge"&gt;idea generation practice&lt;/a&gt;.)&lt;/p&gt;
&lt;h3 id="my-list-of-ideas" class="relative group"&gt;My list of ideas &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#my-list-of-ideas" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h3&gt;&lt;p&gt;Below you can find the raw list of what I came up with.
Feel free to skip it.
Some of these are awful, but I needed to get those out of my system, to get
at the better ones that will come after.&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;Full list&lt;/summary&gt;
&lt;p&gt;Sunday:&lt;br&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;weekly update&lt;/li&gt;
&lt;li&gt;challenging&lt;/li&gt;
&lt;li&gt;better every week&lt;/li&gt;
&lt;li&gt;evolving&lt;/li&gt;
&lt;li&gt;challenge update&lt;/li&gt;
&lt;li&gt;more from me&lt;/li&gt;
&lt;li&gt;progress report&lt;/li&gt;
&lt;li&gt;progressive enhancement&lt;/li&gt;
&lt;li&gt;bit by bit&lt;/li&gt;
&lt;li&gt;step by step&lt;/li&gt;
&lt;li&gt;every week&amp;rsquo;s a challenge&lt;/li&gt;
&lt;li&gt;challenged weekly&lt;/li&gt;
&lt;li&gt;challenged news&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;all the evolution&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;hardly structured (too deep)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Monday:&lt;br&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;the hard report&lt;/li&gt;
&lt;li&gt;the retort report (off topic)&lt;/li&gt;
&lt;li&gt;daring updates&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;daring progression&lt;/strong&gt; (double meaning)&lt;/li&gt;
&lt;li&gt;daring darling&lt;/li&gt;
&lt;li&gt;daring change&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;daring development&lt;/strong&gt; (1. hard development, 2. challenging progress itself)&lt;/li&gt;
&lt;li&gt;growth report&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;changing for the better&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;keeping up the momentum&lt;/li&gt;
&lt;li&gt;keeping up with evolution&lt;/li&gt;
&lt;li&gt;winding progression&lt;/li&gt;
&lt;li&gt;the winding ways (analogy for change)&lt;/li&gt;
&lt;li&gt;wandering to victory&lt;/li&gt;
&lt;li&gt;the winding road of progress&lt;/li&gt;
&lt;li&gt;the winding approach&lt;/li&gt;
&lt;li&gt;roundabout rise&lt;/li&gt;
&lt;li&gt;daring drive&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Tuesday:&lt;br&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;demanding more of yourself&lt;/li&gt;
&lt;li&gt;down the road (analogy for progress)&lt;/li&gt;
&lt;li&gt;further along (sound more like a coaching format or a podcast)&lt;/li&gt;
&lt;li&gt;another week, another way&lt;/li&gt;
&lt;li&gt;the long road to rising/riches&lt;/li&gt;
&lt;li&gt;the winding path of betterment&lt;/li&gt;
&lt;li&gt;the winding path of development&lt;/li&gt;
&lt;li&gt;the winding path to nowhere&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;a winding path of progress&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;demanding development&lt;/strong&gt; (double meaning)&lt;/li&gt;
&lt;li&gt;endearing evolution&lt;/li&gt;
&lt;li&gt;endearing development&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Wednesday:&lt;br&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;stimulating growth (double meaning)&lt;/li&gt;
&lt;li&gt;stimulating progress (double meaning)&lt;/li&gt;
&lt;li&gt;stimulate positive change&lt;/li&gt;
&lt;li&gt;stimulating transformation&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;flowing towards transformation&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;a winding way of awakening&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;a winding way of advancement&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;a winding walk of competence&lt;/li&gt;
&lt;li&gt;a winding walk to transformation (too on the nose)&lt;/li&gt;
&lt;li&gt;winding up on top&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;winding up better&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;a small step for man&lt;/li&gt;
&lt;li&gt;the smallest of changes&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Thursday:&lt;br&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;continuous improvement&lt;/li&gt;
&lt;li&gt;inspiring incremental improvement&lt;/li&gt;
&lt;li&gt;incremental improvement report&lt;/li&gt;
&lt;li&gt;choosing to pursue&lt;/li&gt;
&lt;li&gt;choosing to improve&lt;/li&gt;
&lt;li&gt;choosing transformation&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Friday:&lt;br&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;wafting waves of success&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;wafting winds of change&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Saturday:&lt;br&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;undoubtedly better&lt;/li&gt;
&lt;li&gt;mastering the path forward&lt;/li&gt;
&lt;li&gt;IMprovement (incremental momentum)&lt;/li&gt;
&lt;li&gt;various ways to evolve&lt;/li&gt;
&lt;li&gt;wasting daylight&lt;/li&gt;
&lt;li&gt;the inner game of progress&lt;/li&gt;
&lt;li&gt;now that&amp;rsquo;s a challenge!&lt;/li&gt;
&lt;li&gt;enhance! (zoom-in in movies)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ok, towards the finish I was going off the deep end :joy:.&lt;/p&gt;
&lt;/details&gt;
&lt;h3 id="effects" class="relative group"&gt;Effects &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#effects" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h3&gt;&lt;p&gt;Thinking of names confronted me with the questions of: What am I doing with
the newsletter? What does it stand for? How can I capture that in a word? Or
an image?&lt;/p&gt;
&lt;h3 id="themes" class="relative group"&gt;Themes &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#themes" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h3&gt;&lt;p&gt;To me, the newsletter is about continuous personal development and growth.&lt;/p&gt;
&lt;p&gt;The three images I came up with that embodied this were:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Walking a winding path. Progress has it&amp;rsquo;s twists and turns but you just
have to keep going and you will make it to the end. The path not
straight-forward and differs for each individual. We&amp;rsquo;re all own our own
journey.&lt;/li&gt;
&lt;li&gt;A river flowing downstream. The river flows continuously.
The water that it is made up of has a lot of power.
The river &lt;em&gt;will&lt;/em&gt; make it&amp;rsquo;s own way.&lt;/li&gt;
&lt;li&gt;A (sun)flower waving in the wind (see my logo.) The winds might blow in
this or that direction, but the flower remains stoic.
The flower needs to keep growing or it will wither away, it goes through
it&amp;rsquo;s own lifes journey.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="picking-a-winner" class="relative group"&gt;Picking a winner &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#picking-a-winner" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h3&gt;&lt;p&gt;I went through and picked a selection of contenders (bolded in the list
above), which I weeded down to five candidates.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Flowing towards Transformation&lt;/li&gt;
&lt;li&gt;A Winding Path of Progress&lt;/li&gt;
&lt;li&gt;Changing for the Better&lt;/li&gt;
&lt;li&gt;Winding up Better&lt;/li&gt;
&lt;li&gt;Wafting Winds of Change&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;With input from my wife, I decided on &lt;strong&gt;A Winding Path of Progress&lt;/strong&gt;, which
had been my favorite picture all along.&lt;/p&gt;
&lt;h3 id="tools-used" class="relative group"&gt;Tools used &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#tools-used" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h3&gt;&lt;p&gt;Because I played around with alliterations, I created myself a list of nouns
to reference what I wanted the newsletter to symbolize.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;challenge&lt;/li&gt;
&lt;li&gt;progress&lt;/li&gt;
&lt;li&gt;evolution&lt;/li&gt;
&lt;li&gt;development&lt;/li&gt;
&lt;li&gt;change&lt;/li&gt;
&lt;li&gt;growth&lt;/li&gt;
&lt;li&gt;momentum&lt;/li&gt;
&lt;li&gt;enhancement&lt;/li&gt;
&lt;li&gt;transformation&lt;/li&gt;
&lt;li&gt;shift&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I expanded this list by looking through
&lt;a href="https://www.thesaurus.com" rel="external"&gt;Synonyms&lt;/a&gt; and having &lt;a href="https://jneidel.com/ai/"&gt;Claude&lt;/a&gt; generate me a
noun with a similar meaning, but starting with the letter X.&lt;/p&gt;
&lt;p&gt;Also: &lt;a href="https://www.merriam-webster.com/" rel="external"&gt;Merriam Webster&lt;/a&gt; for definitions.&lt;/p&gt;
&lt;h3 id="creating-a-logo" class="relative group"&gt;Creating a logo &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#creating-a-logo" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h3&gt;&lt;p&gt;I had already envisioned a logo to go along with this title while I
conceived it.
I wanted a twisting road making its way into the horizon.
To an &lt;a href="https://jneidel.com/ai/"&gt;image generation AI&lt;/a&gt; I went.
This was my prompt:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;winding path into the distance drawn in fine red line #d70000 on white background, minimalistic simple, no scenery
&lt;/code&gt;&lt;/pre&gt;
 
 
 
 
 
 
 

 
 
 

 
 

 
 
 
 
 
 &lt;figure class="w-8/12 mx-auto my-0 rounded-sm"&gt;
 &lt;img src="./original.jpeg" alt="The original version of the logo" class="w-8/12 mx-auto my-0 rounded-sm"/&gt;
 &lt;figcaption class="text-center"&gt;The original version image.&lt;/figcaption&gt;
 &lt;/figure&gt;


&lt;p&gt;After some editing in &lt;a href="https://www.gimp.org/" rel="external"&gt;GIMP&lt;/a&gt; (the linux photoshop), I had this final result:&lt;/p&gt;

 
 
 
 
 
 
 

 
 
 

 
 

 
 
 
 
 
 &lt;figure class="w-7/12 mx-auto my-0 rounded-sm"&gt;
 &lt;img src="./result.png" alt="The final result of the logo" class="w-7/12 mx-auto my-0 rounded-sm"/&gt;
 &lt;figcaption class="text-center"&gt;The resulting logo on the website.&lt;/figcaption&gt;
 &lt;/figure&gt;


&lt;p&gt;I added some logic to my website, where on &lt;code&gt;/newsletter&lt;/code&gt; routes it would
display this logo, rather than my normal sunflower.
&lt;a href="https://github.com/jneidel/jneidel.com/commit/97c61f9943d4632913ed2c4c3cc6edbdd97e39ec#diff-b25dcd1691733aecbe70f1ec2c608fd30fa37fcb25951b719d06913b5ed53d4d" rel="external"&gt;Here is the code&lt;/a&gt;
of how I did that in my hugo setup.&lt;/p&gt;
&lt;h2 id="conclusion" class="relative group"&gt;Conclusion &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#conclusion" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;This was fun and easy to do.
The method of generating many ideas over time worked very well for me.&lt;/p&gt;
&lt;p&gt;If you are now interested in checking out the newsletter, you can sign up below:wink:&lt;/p&gt;
&lt;div class="footnotes" role="doc-endnotes"&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id="fn:1"&gt;
&lt;p&gt;I wasn&amp;rsquo;t so fixated on the number. My target was 12, but some
days I left it at less than that.&amp;#160;&lt;a href="#fnref:1" class="footnote-backref" role="doc-backlink"&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</description></item><item><title>What Is NLP? (Neuro Linguistic Programming)</title><link>https://jneidel.com/misc/what-is-nlp/</link><pubDate>Thu, 03 Oct 2024 00:00:00 +0000</pubDate><author>web@jneidel.com (Jonathan Neidel)</author><guid>https://jneidel.com/misc/what-is-nlp/</guid><description>&lt;p&gt;NLP means a lot of things to a lot of people.
There are many ways to define it.
I will try to give you a sense of what NLP is at it&amp;rsquo;s core.&lt;/p&gt;
&lt;h2 id="the-acronym" class="relative group"&gt;The acronym &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#the-acronym" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;Often, NLP is &amp;ldquo;explained&amp;rdquo; by just dropping the expanded form of the acronym
and leaving it at that.
Like that&amp;rsquo;s the ultimate truth.
(To be fair, I&amp;rsquo;ve done that :smile:.)&lt;/p&gt;
&lt;p&gt;&amp;ldquo;&lt;strong&gt;N&lt;/strong&gt;euro &lt;strong&gt;L&lt;/strong&gt;inguistic &lt;strong&gt;P&lt;/strong&gt;rogramming&amp;rdquo; is what Richard Bandler came up
with, because at the time, he had Neurology, Linguistics and Programming
text books in front of him.
Yes, NLP is concerned with how the brain works (Neurology) and uses words
(Linguistics) to program the mind.
But what does this actually mean?&lt;/p&gt;
&lt;h2 id="the-founder" class="relative group"&gt;The founder &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#the-founder" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;Richard Bandler, the co-founder of NLP, describes the field in a few
different ways.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;NLP is a user manual for your brain.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;It&amp;rsquo;s the &lt;strong&gt;study of the structure of conscious thought&lt;/strong&gt; and how it
influences you.&lt;br&gt;
The conscious mind and the way we think determines how our Neurology
functions and how we build neurocotical pathways.&lt;br&gt;
It&amp;rsquo;s all about using language itself, either on you or another person, to
change Neurology to &lt;strong&gt;build permanent solutions to problems&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;NLP is more than the techniques that come out of it:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;NLP is an &lt;strong&gt;attitude&lt;/strong&gt; and a &lt;strong&gt;methodology&lt;/strong&gt; that leaves a trail of techniques
behind.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The mentioned attitude &lt;q&gt;is an insatiable curiosity about human beings&lt;/q&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;NLP is the study of the structure of subjective experience and what can be
calculated from it.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;It explores how the brain works subjectively and aims to elicit working
strategies and formulates them into useful techniques – better ways to use
your brain, as measured by the outcomes one would like to achieve.&lt;/p&gt;
&lt;h2 id="my-teachers" class="relative group"&gt;My teachers &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#my-teachers" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;These are some quote from my &lt;a href="https://jneidel.com/de/review/nlp23"&gt;Practitioner&lt;/a&gt;&lt;sup&gt;
 &lt;abbr class="no-underline" title="The linked article is in German."&gt;:de:&lt;/abbr&gt;
&lt;/sup&gt;
.
Their definitions focus on the freedoms that NLP gives you, when you apply
it to your life.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;NLP is freedom.
&lt;br&gt;– Alexander Hartmann&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;NLP bedeutet, die &lt;strong&gt;Freiheit&lt;/strong&gt; zu haben, in jedem Moment deines Lebens durch
deine Gedanken &lt;strong&gt;entscheiden zu können&lt;/strong&gt;, wie die Welt auf dich wirkt und wie du
auf die Welt wirken kannst.
&lt;br&gt;– Vanessa Buchner&lt;/p&gt;
&lt;/blockquote&gt;
&lt;details&gt;
&lt;summary&gt;English translation&lt;/summary&gt;
&lt;blockquote&gt;
 NLP means to have the freedom to decide, in every moment of your life
 through your thoughts, how the world affects you and how you can affect
 the world.
&lt;/blockquote&gt;
&lt;/details&gt;
&lt;blockquote&gt;
&lt;p&gt;NLP is the part of psychology that works.
&lt;br&gt;– Christian Goebel&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This hints at the history of NLP.
In the early development of NLP, Bandler and Grinder (the founders) modeled
the strategies of psychologists, who could reliably achieve successful
outcomes.
They created simple but powerful techniques out of those strategies, which
effectively can be used for getting rid of phobias, trauma, etc.&lt;/p&gt;
&lt;p&gt;Since then, Bandler and Grinder have gone their own ways, but both agree
that modelling is the real key to NLP.&lt;/p&gt;
&lt;h2 id="mine" class="relative group"&gt;Mine &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#mine" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;Instead of a definition, I have a set of questions, which NLP provides the
answers for.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;How do I let go of a memory/picture&lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt; or a sound&lt;sup id="fnref:2"&gt;&lt;a href="#fn:2" class="footnote-ref" role="doc-noteref"&gt;2&lt;/a&gt;&lt;/sup&gt; that has
been plaguing me?&lt;/li&gt;
&lt;li&gt;How do I get into a desired state&lt;sup id="fnref:3"&gt;&lt;a href="#fn:3" class="footnote-ref" role="doc-noteref"&gt;3&lt;/a&gt;&lt;/sup&gt;?&lt;/li&gt;
&lt;li&gt;How do I get rid of a fear/phobia&lt;sup id="fnref:4"&gt;&lt;a href="#fn:4" class="footnote-ref" role="doc-noteref"&gt;4&lt;/a&gt;&lt;/sup&gt; or a limiting
belief&lt;sup id="fnref:5"&gt;&lt;a href="#fn:5" class="footnote-ref" role="doc-noteref"&gt;5&lt;/a&gt;&lt;/sup&gt;?&lt;/li&gt;
&lt;li&gt;How do I change my subconcious, automatic reactions&lt;sup id="fnref:6"&gt;&lt;a href="#fn:6" class="footnote-ref" role="doc-noteref"&gt;6&lt;/a&gt;&lt;/sup&gt;?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I&amp;rsquo;m sure, the way that I see NLP will expand, as continue on my NLP journey.&lt;/p&gt;
&lt;div class="footnotes" role="doc-endnotes"&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id="fn:1"&gt;
&lt;p&gt;Sometimes I am haunted by something stupid I did, something
uncomfortable or something I saw that produces an undesired feeling.
I can decrease the intensity by making the picture smaller and pushing it
farther away, view it from a different perspective or make it go away with a
swish.&amp;#160;&lt;a href="#fnref:1" class="footnote-backref" role="doc-backlink"&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:2"&gt;
&lt;p&gt;Sometimes I have caught a catchy sound or have some internal
dialogue that I don&amp;rsquo;t like. I can just turn down the volume or stop it from
looping through a (imagined) control panel I have installed through Design
Human Engineering (DHE.)&amp;#160;&lt;a href="#fnref:2" class="footnote-backref" role="doc-backlink"&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:3"&gt;
&lt;p&gt;You can create reusable anchors or circles of excellence
to get into a desired state.
NLP also gives you the tools to bringing about and intensifying any feeling
you&amp;rsquo;d like.&amp;#160;&lt;a href="#fnref:3" class="footnote-backref" role="doc-backlink"&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:4"&gt;
&lt;p&gt;For phobias, the quick phobia cure is usually best.
A swish or 6-step reframe can work better, if the fear is more general.&amp;#160;&lt;a href="#fnref:4" class="footnote-backref" role="doc-backlink"&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:5"&gt;
&lt;p&gt;To get rid of limiting beliefs I usually use the 6-step
reframe or a parts negotiation.&amp;#160;&lt;a href="#fnref:5" class="footnote-backref" role="doc-backlink"&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:6"&gt;
&lt;p&gt;With a 6-step refame I go in an negotiate or convince a
subconscious part of mine to adjust it&amp;rsquo;s behavior to be (more) in line
with what I want.&amp;#160;&lt;a href="#fnref:6" class="footnote-backref" role="doc-backlink"&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</description></item><item><title>You don't have time?</title><link>https://jneidel.com/essay/no-time/</link><pubDate>Thu, 19 Sep 2024 00:00:00 +0000</pubDate><author>web@jneidel.com (Jonathan Neidel)</author><guid>https://jneidel.com/essay/no-time/</guid><description>&lt;p class="dropcap"&gt;When somebody tells me &lt;q&gt;I don&amp;rsquo;t have time for that.&lt;/q&gt;, my response, or
at least thought, is always: &lt;q&gt;&lt;strong&gt;If you don&amp;rsquo;t have time, you don&amp;rsquo;t
have priorities.&lt;/strong&gt;&lt;/q&gt;
To which they say: Nothing.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s not that they don&amp;rsquo;t have priorities.
They have priorities and are expressing them by saying &lt;q&gt;No&lt;/q&gt; to
something.
If it was important to them, i.e. a priority, they would &lt;q&gt;make time&lt;/q&gt;
for it.
If they had a toothache, they would find the time to go to the dentist.
If a loved on died, they would make it possible to go to the funeral.
If they were really hungry, they would&lt;/p&gt;
&lt;p&gt;People &lt;em&gt;do have time&lt;/em&gt;, but they would rather do something else.
And that&amp;rsquo;s fine.
It&amp;rsquo;s their time.
My problem is with the way in which they express it.
&lt;q&gt;I don&amp;rsquo;t have time&lt;/q&gt; in essence means &lt;q&gt;I don&amp;rsquo;t want to&lt;/q&gt; or &lt;q&gt;I&amp;rsquo;m
not interested.&lt;/q&gt;
But they don&amp;rsquo;t say that.
They go for in indirect or dishonest phrasing.
I see two possible reasons as to why:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;They are unaware of the fact that are not &lt;em&gt;actually&lt;/em&gt; interested.&lt;/li&gt;
&lt;li&gt;They won&amp;rsquo;t directly say they are not interested, for some reason (e.g. to
be polite, not hurt the other persons feelings, etc.)
&lt;br&gt;
The response that 2. will get is:
&lt;ol&gt;
&lt;li&gt;The other person is aware that &amp;ldquo;no time&amp;rdquo; = &amp;ldquo;no interest&amp;rdquo; and they
recognize this phrasing as dishonest, defeating it&amp;rsquo;s purpose.&lt;/li&gt;
&lt;li&gt;The other person is unaware, will mistake it as a sign of interest
and, as a result, will spend more energy to try to make it work, find
another date, etc.
Politeness has the opposite effect, by making it worse for the other
person.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Personally, I say &lt;q&gt;No&lt;/q&gt; honestly, if I&amp;rsquo;m not interested.
Not in a harsh way, but by expressing how I actually feel about it.
For example:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;q&gt;No, but thank you for thinking for of me.&lt;/q&gt;&lt;/li&gt;
&lt;li&gt;&lt;q&gt;Going to bed, at a reasonable time, is more important for me.&lt;/q&gt;&lt;/li&gt;
&lt;li&gt;&lt;q&gt;I would be up for something, but I&amp;rsquo;m not interested in getting a
drink.&lt;/q&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I propose another date that works for me, if I already have something more
important scheduled: &lt;q&gt;I don&amp;rsquo;t have time on Tuesday, how about Thursday
instead?&lt;/q&gt;
Through this I express my interest and meet them halfway in finding a date
that works.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s just better communication, as measured by it&amp;rsquo;s outcomes.&lt;/p&gt;</description></item><item><title>Documentary Notes: 20 Days in Mariupol</title><link>https://jneidel.com/review/20-days-in-mariupol/</link><pubDate>Wed, 11 Sep 2024 00:00:00 +0000</pubDate><author>web@jneidel.com (Jonathan Neidel)</author><guid>https://jneidel.com/review/20-days-in-mariupol/</guid><description>&lt;h2 id="what-is-the-film-about" class="relative group"&gt;What is the film about? &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#what-is-the-film-about" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;Shown are early days of Russia&amp;rsquo;s 2022 invasion of Ukraine, from a civilian
perspective, in one of the first cities that was hit.
The footage is a raw, only lightly editorialized Ukrainian perspective on
the ground.
We see what the early stage of the war did to regular people.&lt;/p&gt;
&lt;h2 id="main-themes" class="relative group"&gt;Main themes &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#main-themes" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Good people; bad people&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;War is like an x-ray, all human insides become visible.
Good people become better, bad people worse.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Your real character is revealed and enhanced in extraordinary circumstances.
The good people work tirelessly in the hospital and go out of their way to
help strangers, those in need.&lt;/p&gt;
&lt;p&gt;The bad go around, loot and pillage their own neighborhood:
The toy store and hair saloon.
They take selfishly for themselves, without reason or regard for others.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Phones without cell towers&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;A few days into the war, the Russians cut the electricity and the cell
towers.
Smartphones, so overused in normal life, turned almost useless.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;People charge cellphones from a generator.
Just to use them as flashlights.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This was a huge problem for our journalists as well.
In the first days of the war, they could easily send their pictures and
video from anywhere.
Suddenly, no signal.
Based on a tip, they found the last spot in the city, which still had
reception.
That place became an inconvenient, regular, dangerous destination.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The information war&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Without any information, people don&amp;rsquo;t know who to blame.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;In one scene, the journalists spoke to a group of people, about what
happened around the city.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Person 1: &lt;q&gt;Who is bombing us? Tell us.&lt;/q&gt;&lt;/li&gt;
&lt;li&gt;Journalist: &lt;q&gt;The Russian Federation planes are bombing you.&lt;/q&gt;&lt;/li&gt;
&lt;li&gt;[&amp;hellip;]&lt;/li&gt;
&lt;li&gt;Person 2:
&lt;q&gt;Yeah, yeah, keep filming us. [The] Ukrainian army is fucking bombing us.&lt;/q&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Russian propaganda&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Obviously there would be blatant lies in the Russian, state-controlled
media.
But this scene stuck out for it&amp;rsquo;s unexpected audacity.
The female reporter can&amp;rsquo;t believe it!&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Female reporter:
&lt;q&gt;We&amp;rsquo;ve seen mass graves. Narrow trenches with babies bodies in them.
AP Journalists have been there.&lt;/q&gt;&lt;/li&gt;
&lt;li&gt;Russian ambassador to the UN:
&lt;q&gt;I&amp;rsquo;ve seen so many fakes.
[He] who wins the information war, [will be] the one who wins the war.&lt;/q&gt;&lt;/li&gt;
&lt;li&gt;Female reporter:
&lt;q&gt;Do you really, truely believe that?
Do you truely believe what you are saying?&lt;/q&gt;&lt;/li&gt;
&lt;li&gt;Russian ambassador to the UN:

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 &lt;figure class="w-10/12 mx-auto my-0 rounded-sm"&gt;
 &lt;img src="./turning-away.png" alt="Russian ambassador to the UN turning away from a reporter" class="w-10/12 mx-auto my-0 rounded-sm"/&gt;
 &lt;figcaption class="text-center"&gt;The body language and lack of response says it all.&lt;/figcaption&gt;
 &lt;/figure&gt;
 
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;And Russia is intent on winning the war!
No matter the means.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;War crimes and an urban wasteland&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;While watching I asked myself: What is the point of laying waste to the
whole city?
The Russians targeted civilian residential areas, specifically.
They primarily used artillery fire and shelling from afar.
One could argue that these are not so precise and could have been aimed at
something else.
But there were also tanks on the ground, shooting multiple rounds through
tall apartment buildings, something that could serve no military objective.&lt;/p&gt;
&lt;p&gt;What could be the point for Russia to bomb out residential areas, hospitals
and fire stations?
Maybe to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Get the civilians out of the city.
Some high percentage left while they had the chance.
This would mean less people who are aiding or abetting the enemy fighters.&lt;/li&gt;
&lt;li&gt;Demonstrate strength.
Strike fear into the enemy and it&amp;rsquo;s population.
Make them want to surrender.
That kind of behavior can have the opposite effect though.
It can inspire resistance, feelings of revenge.
It can serve as ammunition for the other side.
Ukraine can (and did) use these atrocities to recruit international help.&lt;/li&gt;
&lt;li&gt;Force the displacement of the local population and, after annexing the
area, integrate it into Russia and bring in Russian citizens to take over
this strategic city.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;But there are so many more questions with this behavior:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Why are they intentionally committing war crimes?&lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;br&gt;
&amp;ldquo;They can&amp;rsquo;t persecute us anyway and we already got all of these sanctions,
fuck it.&amp;rdquo;???&lt;/li&gt;
&lt;li&gt;Why are they spending all of that money on arms, just to flatten
buildings with no tactical value?&lt;/li&gt;
&lt;li&gt;Are they not interested in using the city after they it over for themselves?
That&amp;rsquo;s a lot of infrastructure and private property damage to repair before
normalcy can return.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
 
 
 
 
 
 
 

 
 
 

 
 

 
 
 
 
 
 &lt;figure class="w-10/12 pb-1 mx-auto my-0 rounded-sm"&gt;
 &lt;img src="./destruction-1.png" alt="Destroyed house." class="w-10/12 pb-1 mx-auto my-0 rounded-sm"/&gt;
 
 &lt;/figure&gt;



 
 
 
 
 
 
 

 
 
 

 
 

 
 
 
 
 
 &lt;figure class="w-10/12 pb-1 mx-auto my-0 rounded-sm"&gt;
 &lt;img src="./destruction-2.png" alt="Destroyed shopping district." class="w-10/12 pb-1 mx-auto my-0 rounded-sm"/&gt;
 
 &lt;/figure&gt;



 
 
 
 
 
 
 

 
 
 

 
 

 
 
 
 
 
 &lt;figure class="w-10/12 mx-auto my-0 rounded-sm"&gt;
 &lt;img src="./destruction-3.png" alt="Destroyed university." class="w-10/12 mx-auto my-0 rounded-sm"/&gt;
 
 &lt;/figure&gt;

&lt;/p&gt;
&lt;h2 id="conclusions" class="relative group"&gt;Conclusions &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#conclusions" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;Well worth watching.
You get a civilian perspective on war.
This being a documentary makes what you see more impactful, than the many
fictional movies about war I&amp;rsquo;ve watched.&lt;/p&gt;
&lt;div class="footnotes" role="doc-endnotes"&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id="fn:1"&gt;
&lt;p&gt;See the Geneva Convention.&amp;#160;&lt;a href="#fnref:1" class="footnote-backref" role="doc-backlink"&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</description></item><item><title>Open Ear Headphones Review: Oladance</title><link>https://jneidel.com/review/oladance-open-ear-headphones/</link><pubDate>Sun, 25 Aug 2024 00:00:00 +0000</pubDate><author>web@jneidel.com (Jonathan Neidel)</author><guid>https://jneidel.com/review/oladance-open-ear-headphones/</guid><description>&lt;h2 id="what-are-open-ear-headphones" class="relative group"&gt;What are open ear headphones? &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#what-are-open-ear-headphones" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;As the name suggests: your ears are not covered by putting something over
them (over-ear) or into them (in-ear).
The result is: you can clearly hear the outside world at all times.&lt;/p&gt;
&lt;h2 id="why-oladance" class="relative group"&gt;Why Oladance? &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#why-oladance" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;In late 2022, when I was looking for a pair of open ear headphones,
the selection was very small.
I got one of the available styles each and tried them out:&lt;/p&gt;
&lt;div class="flex flex-row justify-center items-start gap-2 [&amp;&gt;*]:min-w-0
 "&gt;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 &lt;figure class="w-9/12 mx-auto my-0 rounded-sm"&gt;
 &lt;img src="./Oladance.jpg" alt="Oladance open ear headphones" class="w-9/12 mx-auto my-0 rounded-sm"/&gt;
 &lt;figcaption class="text-center"&gt;Oladance open ear&lt;/figcaption&gt;
 &lt;/figure&gt;
 

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 &lt;figure class="w-12/12 mx-auto my-0 rounded-sm"&gt;
 &lt;img src="./Aftershokz-OpenMove.jpg" alt="Aftershokz OpenMove Bone-Conduction headphones" class="w-12/12 mx-auto my-0 rounded-sm"/&gt;
 &lt;figcaption class="text-center"&gt;Aftershokz bone-conduction headphones&lt;/figcaption&gt;
 &lt;/figure&gt;
 


&lt;/div&gt;

&lt;p&gt;I felt right at home with the &lt;a href="https://amzn.to/3SYEblL" rel="external"&gt;Oladance&lt;/a&gt;.
My wife preferred the &lt;a href="https://amzn.to/3STECxx" rel="external"&gt;bone-conduction headphones&lt;/a&gt; and kept them :smile:&lt;/p&gt;
&lt;h2 id="why-open-ear" class="relative group"&gt;Why open ear? &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#why-open-ear" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;Open ear headphones have some advantages over in-ear and over-ear
headphones:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;You can hear what&amp;rsquo;s going on around you. Can be convenient, pleasant or a
safety feature&lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt; (depending on use.)&lt;/li&gt;
&lt;li&gt;You can hear your own voice, which is not being blocked out.&lt;/li&gt;
&lt;li&gt;Comfort. They are more comfortable over an extended period of time
(nothing in or pressing on your ear.)&lt;/li&gt;
&lt;li&gt;Stable. They will not fall off your head (no problem on the trampoline.)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="downsides" class="relative group"&gt;Downsides &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#downsides" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h3&gt;&lt;p&gt;I&amp;rsquo;ve only found one downside:
You can hear what&amp;rsquo;s going on around you!
That can be distracting!&lt;/p&gt;
&lt;p&gt;They&amp;rsquo;re not great on public transport or around construction, crowds of
people, big roads, etc.
But I&amp;rsquo;m not in those environments much anymore (if I am I&amp;rsquo;ll use my noise
canceling over-ear headphones.)&lt;/p&gt;
&lt;h2 id="my-experience" class="relative group"&gt;My experience &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#my-experience" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;Open ear headphones shine in quiet environments!&lt;/p&gt;
&lt;p&gt;How I make use of them is best described in use cases:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Use case 1: person talks to you&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m in the kitchen and listening to something.
My wife can just walk up and start talking to me.
There is not this moment of stopping the audio, taking your headphones off
and asking &amp;ldquo;Huh? What did you say?&amp;rdquo; and the other person repeating
themselves.&lt;/p&gt;
&lt;p&gt;Because of the open ear design I understood her the first time.
I still might turn off what I was listening to, but I don&amp;rsquo;t need to (unless
it&amp;rsquo;s very loud.)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Use case 2: listen to something in the background&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m at home, working or doing something.
There are a few different things I might listen to on low volume, passively
in the background.
That might be a &lt;a href="https://jneidel.com/review/neurostreams/"&gt;Neurostream&lt;/a&gt;, silent subliminal, my
philosophy or a language learning piece on a loop.
Either way, I can have it conveniently running in the background, while
hearing everything else normally.&lt;/p&gt;
&lt;p&gt;
 
 
 
 
 
 
 

 

 
 

 
 
 
 
 
 &lt;figure class="w-9/12 sm:max-w-52 sm:w-auto sm:float-right sm:pl-3 my-0"&gt;
 &lt;img src="./on-me.jpg" alt="Head wearing oladance over ear headphones" class="w-9/12 sm:max-w-52 sm:w-auto sm:float-right sm:pl-3 my-0"/&gt;
 
 &lt;/figure&gt;


&lt;strong&gt;Use case 3: hearing nature&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I live at the edge of a forest, which I visit regularly.
With my open ear headphones, I can listen to audiobooks and have calls,
while still hearing the calming and satisfying sounds of nature:
the birds chirping, my footsteps through the high grass, branches breaking
under my feet, the wind blowing past me, etc.
It would be the same without the soundscape.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Use case 4: for language learning&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;To train your speaking ability you will want to: hear a word and then say
that word.
You need the practice to get your pronunciation right.&lt;/p&gt;
&lt;p&gt;Open ear headphones allow me to hear my own voice naturally.
I can have my headphones on and listen to an audio course or my
vocabulary on the go, repeat what I heard and while hearing my own voice
unimpaired.&lt;/p&gt;
&lt;h3 id="sound-quality" class="relative group"&gt;Sound quality &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#sound-quality" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h3&gt;&lt;p&gt;Sound quality is good and music will be enjoyable if you don&amp;rsquo;t have any
overwhelming environment noise.
Calls are enjoyable for both sides :slightly_smiling_face:&lt;/p&gt;
&lt;h2 id="price" class="relative group"&gt;Price &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#price" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;I paid 120€ back in 2022 and that is still the price today.
For me it was well worth what I paid.&lt;/p&gt;
&lt;h3 id="what-model-to-get-today" class="relative group"&gt;What model to get today? &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#what-model-to-get-today" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h3&gt;&lt;p&gt;Nowadays there are many more models to choose from.
After the &lt;a href="https://amzn.to/3SYEblL" rel="external"&gt;first generation&lt;/a&gt;, Oladance released a &lt;a href="https://amzn.to/3Xaf0Pw" rel="external"&gt;second generation&lt;/a&gt; and
a &lt;a href="https://amzn.to/3WUVOE5" rel="external"&gt;pro version&lt;/a&gt;.
&lt;a href="https://amzn.to/4dmpkd3" rel="external"&gt;JBL&lt;/a&gt; and &lt;a href="https://amzn.to/46STORA" rel="external"&gt;soundcore&lt;/a&gt; also created some more affordable alternatives.&lt;/p&gt;
&lt;p&gt;I haven&amp;rsquo;t looked at what&amp;rsquo;s available today in detail, but I would probably
go with Oladance again, if mine were to break now.&lt;/p&gt;
&lt;h2 id="conclusions" class="relative group"&gt;Conclusions &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#conclusions" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;I&amp;rsquo;m really happy with my Oladance.
They are the pair I use the most out of all my headphones and speakers.
They nicely address the described use cases and present a uniquely
comfortable and convenient solution.&lt;/p&gt;
&lt;div class="footnotes" role="doc-endnotes"&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id="fn:1"&gt;
&lt;p&gt;Open ear headphones are often advertised as safe, because you can
hear traffic around you while you are jogging for example.
It&amp;rsquo;s not listed in my use cases, because I don&amp;rsquo;t have traffic where I
live.&amp;#160;&lt;a href="#fnref:1" class="footnote-backref" role="doc-backlink"&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</description></item><item><title>Don't use Negation</title><link>https://jneidel.com/essay/dont/</link><pubDate>Wed, 24 Jul 2024 00:00:00 +0000</pubDate><author>web@jneidel.com (Jonathan Neidel)</author><guid>https://jneidel.com/essay/dont/</guid><description>&lt;p class="dropcap"&gt;When I was 16 the most curious thing happened.
My friend from kindergarten and I were in the backyard of his parents house
in the countryside, mowing the grass with scythes.
Halfway through we&amp;rsquo;re taking a break to sharpen our scythes with hand-sized
grindstones.
He cuts himself in the finger while grinding.
Then I cut myself in the finger, much in the same way.
I had nicked my tendon and ended up in the hospital.&lt;/p&gt;
&lt;p&gt;After the incident I thought for a long time:
&amp;ldquo;How stupid can you be? He cut himself right before you did. You knew what
not to do, but you still did it. That&amp;rsquo;s so stupid.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;Eventually I stopped with that line of thinking.
It was not helpful.
Until now, I never really understood why it happened like that.&lt;/p&gt;
&lt;p&gt;I think it has to do with how our brain processes negation.
When you hear &amp;ldquo;Don&amp;rsquo;t think of a blue elephant&amp;rdquo;, you will imagine one.
&amp;ldquo;Don&amp;rsquo;t make it green&amp;rdquo; and it&amp;rsquo;s green.&lt;/p&gt;
&lt;p&gt;Your brain processes language on different levels.
On the first level of processing it does not comprehend or apply negation.
That&amp;rsquo;s why you see the elephant in front of your inner eye.
On the second level of processing your brain understands what to do, but at
that point it&amp;rsquo;s already too late.&lt;/p&gt;
&lt;p&gt;What picture would this thought have painted in front of my inner eye?
&amp;ldquo;Don&amp;rsquo;t cut yourself while grinding. Don&amp;rsquo;t cut yourself while grinding. etc.&amp;rdquo;
I see me cutting myself.
And then it became a reality and I did cut myself.
I was so drawn to the picture I had incidentally painted for myself.&lt;/p&gt;
&lt;p&gt;Tell a kid &amp;ldquo;Don&amp;rsquo;t spill the milk&amp;rdquo; and watch it spill the milk.
It can&amp;rsquo;t help it.
All the kid can see in front of it&amp;rsquo;s inner eye is the glass tilting, falling
and the milk spilling out.
If you want it not to spill the milk, you need to paint another picture.
&amp;ldquo;Grab your glass firmly. Move it away from the edge.&amp;rdquo;
What does the kid see now?&lt;/p&gt;
&lt;p&gt;Avoid the use of negation when using the imperative (giving commands.)
Come up a different way to describe the desired action or outcome.
When communicating with others, and in your self-talk.&lt;/p&gt;
&lt;h2 id="references" class="relative group"&gt;References &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#references" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;I got this idea from Richard Bandler in his program &lt;cite&gt;Persuasion Engineering&lt;/cite&gt;.&lt;/p&gt;</description></item><item><title>AWS Review: Low-cost vs high-cost providers</title><link>https://jneidel.com/review/aws/</link><pubDate>Wed, 10 Jul 2024 00:00:00 +0000</pubDate><author>web@jneidel.com (Jonathan Neidel)</author><guid>https://jneidel.com/review/aws/</guid><description>&lt;p&gt;I&amp;rsquo;ve tried to keep this review non-technical.
The discussion is relevant not just to AWS, but to other low-cost providers
like it.
The hidden costs need to be considered.
Especially compared to a more pricey option.&lt;/p&gt;
&lt;h2 id="what-is-aws" class="relative group"&gt;What is AWS? &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#what-is-aws" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;Amazon Web Services provides computing resources.
They want to differentiate themselves on price.
You only pay for what you use.
They are the cheapest available option in some categories.&lt;/p&gt;
&lt;h2 id="my-usage" class="relative group"&gt;My usage &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#my-usage" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;I only intended to use AWS on a small scale.
A few things here and there.
Hosting &lt;em&gt;parts&lt;/em&gt; of a project.&lt;/p&gt;
&lt;p&gt;I didn&amp;rsquo;t do any training.
I just logged into the platform and clicked around.&lt;/p&gt;
&lt;p&gt;If you don&amp;rsquo;t care about the technical details of what I tried to do with
AWS, &lt;a href="https://jneidel.com/review/aws/#problems"&gt;skip straight to the problems&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id="storage" class="relative group"&gt;Storage &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#storage" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h3&gt;&lt;p&gt;An &lt;a href="https://github.com/jneidel/keystone-demo" rel="external"&gt;app&lt;/a&gt; I was demoing needed some storage.
Looking up S3 and clicking my way through was simple enough.&lt;/p&gt;
&lt;p&gt;It stopped being simple at the bucket policy.
They wouldn&amp;rsquo;t generate it, so I had to paste in some everything-is-allowed
configuration from the internet to get it to work.&lt;/p&gt;
&lt;p&gt;I had no interest in understanding or securing the policy.
Authentication and the like.
That seems really painful.&lt;/p&gt;
&lt;h3 id="host-a-dockerized-app" class="relative group"&gt;Host a dockerized app &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#host-a-dockerized-app" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h3&gt;&lt;p&gt;I had a docker compose app I wanted to be available 24/7.&lt;/p&gt;
&lt;p&gt;I thought &amp;ldquo;how complicated could it be&amp;rdquo; and grabbed a guide.
After clicking my way through a bunch of modules, setting up a RDS, EC2,
Firewall, Internet Gateway, etc. I concluded that I would not be able to
make it work.
The app was constantly crashing and not reachable from the outside.
Debugging experience was horrible.&lt;/p&gt;
&lt;h3 id="send-email" class="relative group"&gt;Send Email &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#send-email" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h3&gt;&lt;p&gt;I wanted to send an email newsletter for this website.
At 1$ per 10.000 emails SES is the undefeated price leader&lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt;.&lt;/p&gt;
&lt;p&gt;I had configured Sendgrid some weeks before for a different project.
That was super easy.
SES was not.&lt;/p&gt;
&lt;p&gt;I could not just send a test email to my own email, I could only trigger an
internal test case.
You can&amp;rsquo;t do anything without production access, for which you need to
apply.
My experience with that and some other little issues are described below in
&lt;a href="https://jneidel.com/review/aws/#little-annoyances"&gt;little annoyances&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="problems" class="relative group"&gt;Problems &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#problems" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;I found there to be a lot of things wrong with AWS.
I cannot say, that the same is true of all low-cost providers.
But, I would expect higher-cost providers to do better than this.&lt;/p&gt;
&lt;h3 id="user-experience" class="relative group"&gt;User experience &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#user-experience" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h3&gt;&lt;p&gt;I know computers.
I can work navigate around a new website fine.&lt;/p&gt;
&lt;p&gt;I could not complete any task without getting help from the internet.
Sure I could go in and delete something.
But I wouldn&amp;rsquo;t know if that deleted everything (the answer is No.)
I could create something, but it wouldn&amp;rsquo;t work.
Least of all could I understand how things worked.&lt;/p&gt;
&lt;p&gt;There is technical mumbo-jumbo everywhere.
Everything has arcane names and tons of options.
You have to select the right region to see anything.
Important points are hidden away in a menu somewhere.&lt;/p&gt;
&lt;p&gt;At no point was navigating the site ever easy, enjoyable or even just
bearable.
Every login I knew &amp;ldquo;this is gonna suck.&amp;rdquo;&lt;/p&gt;
&lt;h3 id="cost-management" class="relative group"&gt;Cost management &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#cost-management" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h3&gt;&lt;p&gt;At no point did I know what costs I would incur as the consequence of my
actions.
You won&amp;rsquo;t know what is or is not covered by the free tier.
You won&amp;rsquo;t know if it cost you anything until you get the invoice.&lt;/p&gt;
&lt;p&gt;Not that you can understand the invoice.
Nothing is clickable.
Good luck figuring out by yourself which component and what inside of it is
creating these charges.&lt;/p&gt;
&lt;p&gt;It took me three months to figure out what I was even being charged for.
Each time removing the things that I thought to be causing the costs.
Only with multiple searches and ChatGPT debugging did I finally get it.
Well, I don&amp;rsquo;t know if I got it, I&amp;rsquo;ll have to wait until for the next invoice
to be sure :weary:&lt;/p&gt;

 
 
 
 
 
 
 

 
 
 

 
 

 
 
 
 
 
 &lt;figure class="w-11/12 mx-auto my-0 rounded-sm"&gt;
 &lt;img src="./cost-overview.png" alt="Unclickable AWS Cost Explorer" class="w-11/12 mx-auto my-0 rounded-sm"/&gt;
 &lt;figcaption class="text-center"&gt;Just let me click on it and disable what is causing the charge.&lt;/figcaption&gt;
 &lt;/figure&gt;


&lt;h3 id="dishonesty" class="relative group"&gt;Dishonesty &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#dishonesty" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h3&gt;&lt;p&gt;The cost management design described above is clearly flawed from a user
perspective.
Generally flaws can either be attributed to incompetence or malice.&lt;/p&gt;
&lt;p&gt;As far as people are concerned, it is generally a good idea to assume
incompetence rather than malice.
Makes it easier to work with them.&lt;/p&gt;
&lt;p&gt;AWS can not claim incompetence.
The cost management is a critical part of a huge operation.
AWS cross-finances Amazons money-loosing ventures.
It&amp;rsquo;s Amazons golden goose.&lt;/p&gt;
&lt;p&gt;They would remedy this if they wanted to.
They don&amp;rsquo;t want to.
The flaws serve them.
That make the intention behind it malice.&lt;/p&gt;
&lt;p&gt;For their own benefit, they are screwing over the user intentionally.
AWS knows that people are paying for stuff they don&amp;rsquo;t want, for resources
they are having a hard time getting rid off.
AWS knows what they are doing.
They are bad faith actors.&lt;/p&gt;
&lt;h3 id="complexity" class="relative group"&gt;Complexity &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#complexity" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h3&gt;&lt;p&gt;&lt;abbr title="Keep it simple, stupid"&gt;KISS&lt;/abbr&gt; is a foreign concept to the
AWS people.
Everything. Is. So. Complicated.
The site is just not understandable without training.&lt;/p&gt;
&lt;p&gt;I get it.
You&amp;rsquo;re trying to sell to enterprise customers.
They demand full customizability on everything.
And they can pay their employees for hours and hours of training and
performing BS tasks.&lt;/p&gt;
&lt;h3 id="little-annoyances" class="relative group"&gt;Little annoyances &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#little-annoyances" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;AWS Email: &amp;ldquo;We have received your support ticket.&amp;rdquo;&lt;/li&gt;
&lt;li&gt;I close the tab because I assume they will now process it.&lt;/li&gt;
&lt;li&gt;AWS Email: &amp;ldquo;Actually you&amp;rsquo;re not done.
Answer all of these questions.
If you don&amp;rsquo;t we&amp;rsquo;ll just close this ticket.&amp;rdquo;&lt;/li&gt;
&lt;li&gt;I have to go back to copy-paste my answers.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;You already asked me to fill out a bunch of stuff.
Why do you ask for more details right after?
You haven&amp;rsquo;t even looked at my responses.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Your DNS records for the DKIM setup are no longer present.&lt;sup id="fnref:2"&gt;&lt;a href="#fn:2" class="footnote-ref" role="doc-noteref"&gt;2&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Ok, but I didn&amp;rsquo;t change anything.
I checked and far as I can see my DNS records are still correct.
Must be their mistake.
5 days pass.
&amp;ldquo;We are now disabling DKIM.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;It is their mistake, but it is my problem to clean up :weary:&lt;/p&gt;
&lt;h2 id="pareto--rois" class="relative group"&gt;Pareto &amp;amp; ROIs &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#pareto--rois" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;After what I have seen from AWS, I would categorize them in the 20% of
services that create 80% of the headaches for me.
I know, that if I stay with them, there is gonna be one issue after the other.
Random things break, &amp;ldquo;you need a dedicated IP,&amp;rdquo; undecipherable costs, etc.
Headaches I don&amp;rsquo;t want to deal with.&lt;/p&gt;
&lt;h3 id="roi-comparison" class="relative group"&gt;ROI comparison &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#roi-comparison" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h3&gt;&lt;p&gt;For my emails I&amp;rsquo;ve decided to go with &lt;a href="https://postmarkapp.com" rel="external"&gt;Postmark&lt;/a&gt; over AWS.
Here are the return on investment (ROI) calculations underlying that decision:&lt;/p&gt;
&lt;h4 id="aws-investment" class="relative group"&gt;AWS investment &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#aws-investment" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;1$/10.000 emails&lt;/li&gt;
&lt;li&gt;effort to setup in their complex system&lt;/li&gt;
&lt;li&gt;waiting times to be unlocked for production access&lt;/li&gt;
&lt;li&gt;effort to solve problems by myself (support will treat me like a tiny
fish, since I&amp;rsquo;m not an enterprise customer)&lt;/li&gt;
&lt;li&gt;effort to deal with the &lt;a href="https://jneidel.com/review/aws/#little-annoyances"&gt;little annoyances&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;effort to double check to see how AWS will screw me over (cf. &lt;a href="https://jneidel.com/review/aws/#dishonesty"&gt;bad faith actor&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;uncertainty about invoicing and hidden costs&lt;/li&gt;
&lt;li&gt;uncertainty about deliverability and associated costs&lt;/li&gt;
&lt;li&gt;I feel miserable when using the website&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="aws-returns" class="relative group"&gt;AWS returns &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#aws-returns" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;emails are delivered&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="postmark-investment" class="relative group"&gt;Postmark investment &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#postmark-investment" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;15$/10.000 emails&lt;/li&gt;
&lt;li&gt;effort to setup (minimal)&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="postmark-returns" class="relative group"&gt;Postmark returns &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#postmark-returns" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;emails are delivered&lt;/li&gt;
&lt;li&gt;certainty that I&amp;rsquo;m getting the best deliverability out of the box&lt;/li&gt;
&lt;li&gt;certainty that there are no hidden or future costs&lt;/li&gt;
&lt;li&gt;certainty that the support will be there if I need it&lt;/li&gt;
&lt;li&gt;the website is a joy to use&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The way that I see it, is that Postmark beats out AWS here.
I see AWS with a huge list of investments and risks, most of which are
non-monetary, and delivering simply what is required.&lt;/p&gt;
&lt;p&gt;Postmark I see as user-focused, concious of the costs they are creating for
me and delivering a much superior experience.&lt;/p&gt;
&lt;p&gt;The way that you feel while using the service is not to be understated.
That can be a big part of the returns/costs.&lt;/p&gt;
&lt;h2 id="conclusions" class="relative group"&gt;Conclusions &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#conclusions" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;AWS and similar low-cost providers cost us in non-material ways.
If you take into account the immaterial costs and benefits, a competitor
charging a higher dollar amount might not look so bad.&lt;/p&gt;
&lt;p&gt;If you value your own time, use services that also value your time.
AWS is not one of them.&lt;/p&gt;
&lt;p&gt;Personally I will pay somebody else more money to get a website that makes
things easy for me and is a joy to use.&lt;/p&gt;
&lt;div class="footnotes" role="doc-endnotes"&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id="fn:1"&gt;
&lt;p&gt;At &lt;a href="https://postmarkapp.com/pricing" rel="external"&gt;Postmark&lt;/a&gt; it&amp;rsquo;s 15$ per 10k emails.
At scale this get cheaper, but AWS is just unbeatable.
With Postmark it&amp;rsquo;s still 6.95$ per 10k, even if you send 1 Million emails.&amp;#160;&lt;a href="#fnref:1" class="footnote-backref" role="doc-backlink"&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:2"&gt;
&lt;p&gt;Technical mumbo-jumbo. I did know what DKIM was before this message
either. I would have been fine not knowing.&amp;#160;&lt;a href="#fnref:2" class="footnote-backref" role="doc-backlink"&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</description></item><item><title>Don't interrupt others</title><link>https://jneidel.com/essay/no-interrupting/</link><pubDate>Sun, 07 Jul 2024 00:00:00 +0000</pubDate><author>web@jneidel.com (Jonathan Neidel)</author><guid>https://jneidel.com/essay/no-interrupting/</guid><description>&lt;blockquote&gt;
&lt;p&gt;Yeah, like I was saying…&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p class="dropcap"&gt;Imagine you&amp;rsquo;re walking down a windy forest path.
You can only see some of the path in-front of you.
There are turns, diverging ways and dead trees to climb over.
You don&amp;rsquo;t exactly know where you are going to go, but you&amp;rsquo;ll figure it along
the way.&lt;/p&gt;
&lt;p&gt;There is another person walking the path together with you.
From time to time they just push you.
Off the path and into the shrubs.
You&amp;rsquo;re disoriented, but you get back on the path.
At a fork they push you in the direction they want to go in.
You&amp;rsquo;re slowly climbing over a tree that fallen over the path and they push
you over it.
All good, you landed on your feet.
It wasn&amp;rsquo;t pleasant though.&lt;/p&gt;
&lt;p&gt;You decide to leave that person behind.
You come across another person to walk with.
This person let&amp;rsquo;s you find your way.
They calmly wait while you climb an obstacle.&lt;/p&gt;
&lt;p&gt;Who would you rather walk with?&lt;/p&gt;
&lt;h2 id="get-to-the-point-already" class="relative group"&gt;Get to the point already &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#get-to-the-point-already" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;The path is an analogy for a conversation.
The pushy person is a conversation partner who interrupts all the time.&lt;/p&gt;
&lt;p&gt;With each interruption you need a moment to find your way again.
To refocus on what you were trying to say again.
When you&amp;rsquo;re missing a word (hit an obstacle) the other person finishes your
sentence with what they think you were trying to say.&lt;/p&gt;
&lt;p&gt;As a consequence the person being interrupted has a harder time expressing
themselves and navigating the conversation in a satisfying way.&lt;/p&gt;
&lt;h2 id="a-serial-offender" class="relative group"&gt;A serial offender &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#a-serial-offender" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;That&amp;rsquo;s me.
I think fast and often believed I &lt;em&gt;knew&lt;/em&gt; what the other person was trying to
say and was going to say.
I would try to hurry them along like &amp;ldquo;Yeah, I got that already&amp;rdquo; or &amp;ldquo;and
then you did x and y&amp;rdquo; etc.
Or I jump in to counter their point before they were done making it, based
on what I thought they meant.&lt;/p&gt;
&lt;p&gt;The feedback I got to this behavior ranged from being thought of as rude or
aggressive to &amp;ldquo;You&amp;rsquo;re not really listening to me.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;I would auto-complete the words the other person was searching for:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Other person: &amp;ldquo;I felt so…&amp;rdquo;&lt;/li&gt;
&lt;li&gt;Me: &amp;ldquo;weird, awkward, out-of-place&amp;rdquo;&lt;/li&gt;
&lt;li&gt;Other person: &amp;ldquo;eh, yeah, something like that…&amp;rdquo;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It denies the other person an opportunity to better understand how they feel
by finding the right words for it.
And that&amp;rsquo;s a shame.&lt;/p&gt;
&lt;h2 id="rehabilitation" class="relative group"&gt;Rehabilitation &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#rehabilitation" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;!-- TODO: this section is too big --&gt;
&lt;p&gt;Awareness.
As a first step you need to catch yourself interrupting.
Suppressing the impulse to interrupt is a second step.
Awareness comes first.
A lot is won by noticing that you&amp;rsquo;re interrupting.&lt;/p&gt;
&lt;p&gt;Observe how the other person reacts to it.
Some will be offended or start counter-interrupting you.
Some will not react at all or only very subtly.
That doesn&amp;rsquo;t mean it has no effect, it just might not be observable to you.&lt;/p&gt;
&lt;p&gt;Observe how it changes the conversation.
You might steer the conversation to topics that you want to talk about.
Does the other person get to bring up their topics?
Can they fully tell their side of the story?
Can the other person express how they really feel?
Are there things that you just &lt;em&gt;had&lt;/em&gt; to say?&lt;/p&gt;
&lt;p&gt;In the beginning your automatic interruptions will be too fast for you to
react to.
But with time, you will be able to stop yourself more and more.&lt;/p&gt;
&lt;p&gt;There will be things, that you will want to say, for which there won&amp;rsquo;t be an
opportunity.
The conversation moves on to a different topic or you forget it.
You will learn to let go of those things left unsaid.
Maybe the conversation was better off without them.&lt;/p&gt;
&lt;p&gt;I try to keep my mind empty while the other person speaks.
Holding a response in my head and waiting for an opportunity to throw it
into the conversation leads to more interruptions and worse conversation
flow.
If you give them the space, they will also give you the time to come up with
what you want to say.
When it&amp;rsquo;s your turn, you don&amp;rsquo;t have to rush out a prepared
thought.
You have the time, to take all of what they said into account and come up
with a response.
It will also be a better response, because you were actively listening and have
taken in everything they had to say.&lt;/p&gt;
&lt;h2 id="why-are-you-interrupting" class="relative group"&gt;Why are you interrupting? &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#why-are-you-interrupting" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;A method you can try is to silently say to this yourself, as you are
interrupting: &amp;ldquo;I&amp;rsquo;m not letting you finish your sentence because ______&amp;rdquo; (and
fill in the blank.)&lt;/p&gt;
&lt;p&gt;This will reveal your reason for why you are interrupting.
Something you usually hide from yourself.
Here are some examples of what various people have discovered:&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m not letting you finish your sentence because …&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;… I already know where you&amp;rsquo;re going, and I have something more clever to
say.&lt;/li&gt;
&lt;li&gt;… I might forget what I have to say and lose this great opportunity to
impress you.&lt;/li&gt;
&lt;li&gt;… you&amp;rsquo;re having such a hard time expressing yourself, I&amp;rsquo;m going to help
you by saying it better.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The intention might be a good one.
The outcome usually is not.&lt;/p&gt;
&lt;h2 id="examples-from-my-own-life" class="relative group"&gt;Examples from my own life &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#examples-from-my-own-life" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;At my first job I would interrupt people, who were explaining a problem,
with what I believed to be the answer or a retort to why it&amp;rsquo;s a non-issue.
A girl I did this to became very hostile with me and there were multiple
discussions with the leadership team about my behavior.
Showing respect to her (by not interrupting among other things) put us on
better terms and put the leadership at ease.&lt;/p&gt;
&lt;p&gt;In the same team I would also interrupt people how were taking forever to
get to the point.
That behavior would be appropriate if I were a scrum master or the moderator
of the meeting (I was not.)
Despite some people appreciating that I got the guy to stop rambling, it
still made me look uncooperative.
Since I stopped interrupting, I&amp;rsquo;m seen more as a team player.
We achieve better results and I&amp;rsquo;m more respected.&lt;/p&gt;
&lt;p&gt;I talk a lot with my mom.
I would always put the words that she was missing into her mouth.
She would never hold this against me.
It still stood in the way of her self-expression.
It made the conversation less valuable for her, than it otherwise could have
been.
As a result of giving her more room to breathe in our conversations and
letting her find her words, these conversations have become much more
helpful to her.&lt;/p&gt;
&lt;p&gt;I used to interrupt my brother because I was looking down on him.
I didn&amp;rsquo;t need the whole story because I &lt;em&gt;knew all about&lt;/em&gt; what he was going
through.
I would dismiss what he said and launch straight into the the great wisdom I
had to share on the topic.
Our relationship improved after I meet him on equal terms and let him speak.
He opened up more and I listened better.
I knew better what he was going though.
Thus my &amp;ldquo;wisdom&amp;rdquo;, when I did dispense it, also became much more helpful.&lt;/p&gt;
&lt;h2 id="take-action" class="relative group"&gt;Take action &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#take-action" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;If you recognize yourself in any of these descriptions as an interrupter,
like I did, then this a topic you &lt;em&gt;must&lt;/em&gt; address.
Otherwise it will stand in your way.
People who like you will put up with it, but any high value person you meet
will pick up on your disrespectful behavior and avoid you in the future.
You won&amp;rsquo;t even notice what it costs you.&lt;/p&gt;
&lt;h3 id="questions" class="relative group"&gt;Questions &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#questions" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;Which of the interrupting examples is closest to what you do?&lt;/li&gt;
&lt;li&gt;Can you think of a recent conversation where you interrupted somebody?&lt;/li&gt;
&lt;li&gt;What was your reasons/motivation for interrupting them?&lt;/li&gt;
&lt;li&gt;Are there people who you are interrupting more than others? Why them?&lt;/li&gt;
&lt;li&gt;Is there such a thing as a respectful interruption?&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="recommendations" class="relative group"&gt;Recommendations &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#recommendations" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h3&gt;&lt;p&gt;For a week, commit to paying attention to how you are interrupting others.
Just notice your behavior when the other person speaks.
Remind yourself of this commitment daily (a note on your daily planner,
calendar, on your phone, etc.) and bring this awareness into most
conversations.
This is exactly what I did as part of a &lt;a href="https://jneidel.com/project/challenges/"&gt;weekly challenge&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="references-and-exceptions" class="relative group"&gt;References and Exceptions &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#references-and-exceptions" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;Inspired by &lt;a href="https://www.amazon.de/Need-Your-Love-approval-appreciation/dp/1844130266?&amp;linkCode=ll1&amp;tag=jneidel06-21&amp;linkId=016ef1711a48856b04fb1f162508e831" rel="external"&gt;I Need Your Love - Is That True? (Byron Katie)&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Interrupting somebody, especially somebody rude or inconsiderate, can be a
power play that has it&amp;rsquo;s place.
It still has a negative connotation, so you better have a reason for it.
You are trying to put the other person down, so it doesn&amp;rsquo;t make you look
cooperative.
If the other people in the room don&amp;rsquo;t agree with you, that the person being
interrupted was being disrespectful or was wasting everybody&amp;rsquo;s time then
they could hold it against you.&lt;/p&gt;</description></item><item><title>Neurostreams: Review &amp; Explaination of the brainwave tool</title><link>https://jneidel.com/review/neurostreams/</link><pubDate>Fri, 21 Jun 2024 00:00:00 +0000</pubDate><author>web@jneidel.com (Jonathan Neidel)</author><guid>https://jneidel.com/review/neurostreams/</guid><description>&lt;h2 id="what-are-neurostreams" class="relative group"&gt;What are Neurostreams? &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#what-are-neurostreams" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;&lt;a href="https://www.neurostreams.de#aff=jneidel" rel="external"&gt;Neurostreams&lt;/a&gt; are a powerful tool
for putting you into a desired mental state.
The product itself is a collection of sounds.&lt;/p&gt;
&lt;p&gt;These sounds can make you more focused, calm you down, put you into
deep meditation, give you energy and motivation and more.&lt;/p&gt;
&lt;p&gt;If you want to get an idea of what a Neurostream sounds like:
&lt;audio controls preload="none"&gt;
&lt;source src="https://neurostreams.s3.amazonaws.com/previews/PREVIEW_02_432_Hz_DNA_Talk_4S02v.mp3"/&gt;
&lt;source src="https://server10077.streamplus.de"/&gt;
&lt;/audio&gt;&lt;/p&gt;
&lt;p&gt;A caveat up-front: There is not an official English version of this product.
For the sounds that does &lt;strong&gt;not&lt;/strong&gt; make a difference.
For your convenience I wrote an English &lt;a href="https://jneidel.com/misc/neurostreams-quick-reference/"&gt;quick reference guide&lt;/a&gt;,
which works as an overview for all the available tracks.
It also links to the translated catalogue pages where you can find more
details about each sound.
With that, you should have everything you need, to get the most out of this
great tool.&lt;/p&gt;
&lt;h2 id="how-do-they-work" class="relative group"&gt;How do they work? &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#how-do-they-work" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;Your brainwaves oscillate (swing backward and forth) around a given frequency.
Frequencies are associated with a mental state and are commonly grouped
into&lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Delta: Deep sleep&lt;/li&gt;
&lt;li&gt;Theta: Light sleep, meditation&lt;/li&gt;
&lt;li&gt;Alpha: Relaxed wakefulness, idle, unfocused&lt;/li&gt;
&lt;li&gt;Beta: Active concentration, analytical thinking, problem-solving&lt;/li&gt;
&lt;li&gt;Gamma: Use of higher cognitive functions, highly motivated, peak performance&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;When listening to a Neurostream, your brainwaves synchronize with the
frequency of the included beat.
The beat then modifies that frequency (and your brainwaves along with it) to
take you to a wave length associated with the desired mental state.&lt;/p&gt;
&lt;p&gt;Commonly a track will include an intro section, which &amp;ldquo;picks you up&amp;rdquo; at
an Alpha frequency and then slowly moves the frequency up or down to the
desired level.&lt;/p&gt;
&lt;p&gt;At the end you might have an outro section that returns you to a normal
level.
This is, so you don&amp;rsquo;t remain in e.g. light sleep, but are put back into Beta,
ready to get back to work.&lt;/p&gt;
&lt;h2 id="applications" class="relative group"&gt;Applications &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#applications" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;Neurostreams exist for various different applications, to which they are
specifically tailored.
I will introduce them in groups based what they can do for you.
I will only mention my favorite tracks.
Just know, that there are plenty more out there.
You can discover what works best for you.&lt;/p&gt;
&lt;p&gt;The purpose of this review is to give you an idea of what is possible and
what Neurostreams are doing for me.
If you are interested in more options &amp;amp; details afterwards, you can find a
concise overview of all available tracks in my &lt;a href="https://jneidel.com/misc/neurostreams-quick-reference/"&gt;quick reference guide&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id="calm-me-down" class="relative group"&gt;Calm me down &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#calm-me-down" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h3&gt;&lt;p&gt;Sometimes you just need to take a break.
With these tracks you can put yourself into a near sleep state, from which
you are woken up again.
You can deeply regenerate for a time and effectively recover, ready to
tackle the next thing afterwards.&lt;/p&gt;
&lt;h4 id="how-i-use-it" class="relative group"&gt;How I use it &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#how-i-use-it" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h4&gt;&lt;p&gt;I had always taken a little siesta (lying down some time after lunch.)
But whatever I did, I never felt truly relaxed after.
Mediation takes a lot of practice to get good at.
Napping was ineffective for me, since I can&amp;rsquo;t fall asleep.
It was always better than nothing, but not what I had hoped for.&lt;/p&gt;
&lt;p&gt;Neurostreams dramatically increased the effectiveness of my siesta.
They get me into deep meditation without effort or consistently put me into
a near sleep state much deeper than my nap ever were.
And with less effort.
Much less.&lt;/p&gt;
&lt;p&gt;It also gave me a tool to calm myself in urgent cases of anxiety, where my
thoughts are racing or I was stressed.
I can just do one of these session to be more at ease.&lt;/p&gt;
&lt;p&gt;It just works. Reliably. A tool I never want to miss.&lt;/p&gt;
&lt;h4 id="the-tracks" class="relative group"&gt;The tracks &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#the-tracks" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h4&gt;&lt;a
 class="inline-block !rounded-md bg-primary-600 px-4 py-1 !text-neutral !no-underline hover:!bg-primary-500 dark:bg-primary-800 dark:hover:!bg-primary-700"
 href="https://jneidel.com/documents/neurostreams/katalog-en/DNA_Talk.pdf"
 target="_blank"
 
 role="button"
&gt;
 
DNA Talk :person_in_lotus_position:

&lt;/a&gt;

&lt;p&gt;The standard meditation track.&lt;/p&gt;
&lt;p&gt;In the past (after a lot of training) I was able to meditate deeply for a
good amount of time.
But now, after losing that routine, it is hard to just sit down for 5 mins.&lt;/p&gt;
&lt;p&gt;This track makes it easy though.
It meditates you.
You just sit there.
30 mins of meditation are easily doable.&lt;/p&gt;
&lt;p&gt;Skip the practice and get right to the results.&lt;/p&gt;
&lt;a
 class="inline-block !rounded-md bg-primary-600 px-4 py-1 !text-neutral !no-underline hover:!bg-primary-500 dark:bg-primary-800 dark:hover:!bg-primary-700"
 href="https://jneidel.com/documents/neurostreams/katalog-en/Gaia_Club_Radio.pdf"
 target="_blank"
 
 role="button"
&gt;
 
Gaia Club Radio :radio:

&lt;/a&gt;

&lt;p&gt;My new favorite.
It&amp;rsquo;s deeper than DNA Talk and it&amp;rsquo;s not meditation.
I just lie down and relax deeply.
Afterwards I&amp;rsquo;m more aware, refreshed and ready to tackle a new task.
My perfect Siesta track.&lt;/p&gt;
&lt;p&gt;I put calming down as the first category for a reason.
Having the ability to calm down a frantic mind or recharge my batteries in
the middle of the day is just invaluable.&lt;/p&gt;
&lt;h3 id="improve-my-work" class="relative group"&gt;Improve my work &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#improve-my-work" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h3&gt;&lt;p&gt;Most of my personal and professional work requires a lot of focus.
Writing, studying, researching, reading, coding.
Any kind of knowledge work.&lt;/p&gt;
&lt;p&gt;There are some Neurostreams that put your mind into &amp;ldquo;focus mode&amp;rdquo;.
Making it easier for you to focus and do your best work.&lt;/p&gt;
&lt;h4 id="how-i-use-them" class="relative group"&gt;How I use them &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#how-i-use-them" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h4&gt;&lt;p&gt;The tracks are an easy thing to add.
I just have them running on my headphones while I work.
That&amp;rsquo;s it.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve had tremendous success with these.
Especially in combination with blocking out distractions (notifications,
interruptions and the like) and forgoing (doing without) consumption of
things that would be detrimental to my attention span (short-form video,
social media, the news, YouTube, etc.)&lt;/p&gt;
&lt;h4 id="the-tracks-1" class="relative group"&gt;The tracks &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#the-tracks-1" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h4&gt;&lt;a
 class="inline-block !rounded-md bg-primary-600 px-4 py-1 !text-neutral !no-underline hover:!bg-primary-500 dark:bg-primary-800 dark:hover:!bg-primary-700"
 href="https://jneidel.com/documents/neurostreams/katalog-en/IQ_7000.pdf"
 target="_blank"
 
 role="button"
&gt;
 
IQ 7000 :brain:

&lt;/a&gt;

&lt;p&gt;My main concentration track.
It gets me deeply into focus mode.
Deep work made easy, just tune in.&lt;/p&gt;
&lt;a
 class="inline-block !rounded-md bg-primary-600 px-4 py-1 !text-neutral !no-underline hover:!bg-primary-500 dark:bg-primary-800 dark:hover:!bg-primary-700"
 href="https://jneidel.com/documents/neurostreams/katalog-en/Flow_meets_genius-Flow_triff_Genie.pdf"
 target="_blank"
 
 role="button"
&gt;
 
Flow meets genius :handshake: Flow triff Genie

&lt;/a&gt;

&lt;p&gt;My all-round favorite Neurostream.
It also works well for getting me into flow and focus mode, but I can also
used more generally for lifting my my mood and decreasing anxiety or stress.&lt;/p&gt;
&lt;p&gt;This track can be played via speakers.
Because of that I will switch between IQ 7000 and this one, so I don&amp;rsquo;t have
to wear headphones all day.&lt;/p&gt;
&lt;a
 class="inline-block !rounded-md bg-primary-600 px-4 py-1 !text-neutral !no-underline hover:!bg-primary-500 dark:bg-primary-800 dark:hover:!bg-primary-700"
 href="https://jneidel.com/documents/neurostreams/katalog-en/Brainstorms.pdf"
 target="_blank"
 
 role="button"
&gt;
 
Brainstorms :lightning:

&lt;/a&gt;

&lt;p&gt;As the name suggests: for more effective brainstorming sessions.
The beat is unpredictable and will trigger your brain to make new
connections.
Worked really well when I used it.&lt;/p&gt;
&lt;h3 id="energize-myself" class="relative group"&gt;Energize myself &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#energize-myself" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h3&gt;&lt;p&gt;Sometimes you are unmotivated and can&amp;rsquo;t seem do what you set out for
yourself.
But, you want or need to perform.&lt;/p&gt;
&lt;p&gt;These tracks are perfect for &lt;a href="https://jneidel.com/essay/power-plant/"&gt;generating that energy&lt;/a&gt; and motivation.
They can speed up your brainwaves to a point where you are highly motivated
and where &lt;strong&gt;you will want to do stuff&lt;/strong&gt;.&lt;/p&gt;
&lt;h4 id="the-tracks-2" class="relative group"&gt;The tracks &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#the-tracks-2" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h4&gt;&lt;a
 class="inline-block !rounded-md bg-primary-600 px-4 py-1 !text-neutral !no-underline hover:!bg-primary-500 dark:bg-primary-800 dark:hover:!bg-primary-700"
 href="https://jneidel.com/documents/neurostreams/katalog-en/Sturm_und_Drang.pdf"
 target="_blank"
 
 role="button"
&gt;
 
Sturm und Drang :thunder_cloud_and_rain:

&lt;/a&gt;

&lt;p&gt;It functions like coffee, giving me a boost of energy.
I never drank coffee regularly and the same applies to this track.
I don&amp;rsquo;t use it on a regular basis.
It&amp;rsquo;s a tool I have with me, for the times when I need a little push, when I
otherwise wouldn&amp;rsquo;t want to move.&lt;/p&gt;
&lt;h3 id="falling-asleep" class="relative group"&gt;Falling asleep &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#falling-asleep" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h3&gt;&lt;p&gt;Sometimes you just can&amp;rsquo;t fall asleep.
For whatever reason.
Because you&amp;rsquo;re excited about a trip, you slept during the day or your
thoughts are keeping you up.&lt;/p&gt;
&lt;p&gt;Not being able to sleep hurts your recovery and your performance the next
day.
These tracks can help you to fall asleep or even force you to.&lt;/p&gt;
&lt;h4 id="the-tracks-3" class="relative group"&gt;The tracks &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#the-tracks-3" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h4&gt;&lt;a
 class="inline-block !rounded-md bg-primary-600 px-4 py-1 !text-neutral !no-underline hover:!bg-primary-500 dark:bg-primary-800 dark:hover:!bg-primary-700"
 href="https://jneidel.com/documents/neurostreams/katalog-en/Sleep_forcing-Schlaferzwingung.pdf"
 target="_blank"
 
 role="button"
&gt;
 
Sleep forcing :sleeping: Schlaferzwingung

&lt;/a&gt;

&lt;p&gt;Personally I have a hard time falling asleep.
My wife can sleep anywhere and any time.
The speed with which she falls asleep is really astonishing.
But, that&amp;rsquo;s not me.&lt;/p&gt;
&lt;p&gt;It happens from time to time that I&amp;rsquo;m lying in bed and am excited about
something, my thoughts racing or I had a little too much bluelight/activity
before going to bed.
And I can&amp;rsquo;t fall asleep.&lt;/p&gt;
&lt;p&gt;I tried falling sleep naturally and using some hacks (writing down your
thoughts, sleep drink, cooling down the bed, get up and doing something else
and then returning, etc.), which kinda work, but not as consistently or as
quickly as I would like.
At some point, I just need a hammer to knock myself out.&lt;/p&gt;
&lt;p&gt;This Neurostream is that hammer.
And I am the nail:slightly_smiling_face:.
I can just force myself to fall asleep.
It&amp;rsquo;s the most effective way I&amp;rsquo;ve found to addressing this problem.&lt;/p&gt;
&lt;h2 id="why-this-product" class="relative group"&gt;Why this product? &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#why-this-product" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;I prefer Neurostreams over random YouTube videos, which promise
similar effects.
These tracks were carefully built, tested and refined.
They were designed with specific applications in mind and come with clear
usage instructions.
You don&amp;rsquo;t need to figure them by yourself, you get a working toolbox.&lt;/p&gt;
&lt;p&gt;I discovered this brainwave manipulation through Neurostreams and never
bothered to explore what else is out there, since I am very happy with what
I got.&lt;/p&gt;
&lt;h2 id="costs" class="relative group"&gt;Costs &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#costs" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;I started with the &lt;a href="https://www.neurostreams.de/portfolio/panorama/#aff=jneidel" rel="external"&gt;Panorama&lt;/a&gt;,
which is a diverse set of tracks covering the whole range of what
Neurostreams can do for you.
At only 9€ getting that was a no-brainer for me.
I recommend you start with it as well.&lt;/p&gt;
&lt;p&gt;The Panorama itself will already get you quite far.
If you want some of the missing track or some variety (other versions)
of the Panorama tracks, then you can think about an upgrade.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Don&amp;rsquo;t think about upgrading until you have intensely tested the Panorama.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;In &lt;a href="https://jneidel.com/misc/neurostreams-quick-reference/#buying-guide"&gt;my overview&lt;/a&gt; you can
find what track are included in what bundles.
I bought the now retired Kompendium bundle (today: Panorama + Speicals + Klassiker.)
It provides all tracks I mentioned in this post.
For me it was ca. 110€, because I bought it through the Grand Slam (a bundle
with some other products.)
Otherwise it will cost you 225€.
But, you can also buy tracks individually and get them accredited if you
decide you want a bundle later on.&lt;/p&gt;
&lt;p&gt;The laboratory (Labor) includes more niche, experimental tracks, which
weren&amp;rsquo;t of interest to me.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Try for free&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;On the &lt;a href="https://www.neurostreams.de#aff=jneidel" rel="external"&gt;homepage&lt;/a&gt; Tim has a radio station that cycles through some tracks.
These are missing the intro and outro sections. I never bothered with them.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.neurostreams.de/neurostreams-newsletter-anmeldung/#aff=jneidel" rel="external"&gt;Signing up for the newsletter&lt;/a&gt; gets you the title &lt;a href="https://jneidel.com/documents/neurostreams/katalog-en/Planet_Relax.pdf" target="_blank"&gt;Planet Relax&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="conclusions" class="relative group"&gt;Conclusions &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#conclusions" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;A great toolbox I use regularly and wouldn&amp;rsquo;t want to live without.&lt;/p&gt;
&lt;p&gt;To me, it&amp;rsquo;s part of the 20% of optimizations that deliver 80% of the
results.&lt;/p&gt;
&lt;p&gt;Neurostreams have something to offer for everybody and &lt;strong&gt;I would recommend
everybody to try them&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Start with &lt;a href="https://www.neurostreams.de/portfolio/panorama/#aff=jneidel" rel="external"&gt;Panorama&lt;/a&gt;
and use the &lt;a href="https://jneidel.com/misc/neurostreams-quick-reference/"&gt;quick reference guide&lt;/a&gt; to
understand how to use the tracks.&lt;/p&gt;
&lt;div class="footnotes" role="doc-endnotes"&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id="fn:1"&gt;
&lt;p&gt;&lt;a href="https://en.wikipedia.org/wiki/Neural_oscillation" rel="external"&gt;Read more&lt;/a&gt;&amp;#160;&lt;a href="#fnref:1" class="footnote-backref" role="doc-backlink"&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</description></item><item><title>Does Jim Rohn know what he's talking about? - Person Review</title><link>https://jneidel.com/review/jim-rohn/</link><pubDate>Sat, 01 Jun 2024 00:00:00 +0000</pubDate><author>web@jneidel.com (Jonathan Neidel)</author><guid>https://jneidel.com/review/jim-rohn/</guid><description>&lt;h2 id="who-is-jim-rohn" class="relative group"&gt;Who is Jim Rohn &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#who-is-jim-rohn" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;An author and motivational speaker.
He is known for his various self-help books (7 Strategies for Wealth &amp;amp;
Happiness, My Philosophy For Successful Living), motivational tapes and
speeches.&lt;/p&gt;
&lt;h2 id="was-he-really-a-millionaire" class="relative group"&gt;Was he really a millionaire? &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#was-he-really-a-millionaire" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;His claim to fame and what he proclaims each time he introduces himself is
that he became a millionaire at 30.
He is also open about going broke soon after.
I think going broke that quickly ought to raise some questions.&lt;/p&gt;
&lt;p&gt;Rohn made his million in a MLM company, which soon after went bust.
If the company you work for goes bankrupt and you go bankrupt, it is
probably because all of your assets, all of your wealth is tied up in that company.
That would mean that &amp;ldquo;his million&amp;rdquo; was in company shares.&lt;/p&gt;
&lt;p&gt;A harsh way to look at this would be to say: Profits in company shares are
unrealized profits and fluctuate with the value of the company.
And only when you cash out and realize those profits can you actually claim
to be a millionaire.
On the stock market it would be certainly seen like that.
Holding a stock during it&amp;rsquo;s all-time-high doesn&amp;rsquo;t mean anything if you
didn&amp;rsquo;t sell.&lt;/p&gt;

 
 
 
 
 
 
 

 
 
 

 
 

 
 
 
 
 
 &lt;figure class="w-9/12 mx-auto my-0 rounded-sm"&gt;
 &lt;img src="./unrealized-profits.png" alt="GME Chart with text about buying low and selling low, but claiming millionaire status in between" class="w-9/12 mx-auto my-0 rounded-sm"/&gt;
 &lt;figcaption class="text-center"&gt;An extreme example of claiming millionaire status based on unrealized profits&lt;/figcaption&gt;
 &lt;/figure&gt;


&lt;p&gt;Company shares are illiquid (unless you work at a publicly traded company,
you can&amp;rsquo;t just sell them whenever you want), so he probably couldn&amp;rsquo;t have
sold, even if he wanted to.&lt;/p&gt;
&lt;p&gt;Also don&amp;rsquo;t forget that about taxes.
If you cash out your shares the government will take a (big) cut.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s hard to value privately held companies, so shares were
likely overvalued (it was a failing business after all.)&lt;/p&gt;
&lt;p&gt;Maybe officers at the company above him knew that the ship was going down
and pushed their company shares onto him in place of compensation,
effectively trading value-losing shares against hard cash that they would
have otherwise paid out to him.&lt;/p&gt;
&lt;p&gt;All of this is to say: These theories cast serious doubt on Rohn ever having
been a millionaire like he claims. And even if, it would have only been on paper.&lt;/p&gt;
&lt;h3 id="alternative-scenario" class="relative group"&gt;Alternative scenario &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#alternative-scenario" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h3&gt;&lt;p&gt;Let&amp;rsquo;s say his money didn&amp;rsquo;t only exist on paper (i.e. in company shares), but
was in his bank account.&lt;/p&gt;
&lt;p&gt;The company he works for goes bankrupt, but his money is save because it is
under his control.
The only way he goes personally bankrupt now, is by having terrible money
habits, which would be even worse for his credibility.&lt;/p&gt;
&lt;h2 id="rich-from-public-speaking" class="relative group"&gt;Rich from public speaking &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#rich-from-public-speaking" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;After the bust he got rich by holding seminars and where he (among other
things) taught others how to get rich.
All from a guy who wasn&amp;rsquo;t rich himself and had only been rich on paper
before.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s the paradox of practice:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;to teach wisdom that the teacher himself hasn&amp;rsquo;t successfully used in his life&lt;br&gt;
– Mj DeMarco in &lt;cite&gt;The Millionaire Fastlane&lt;/cite&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Wouldn&amp;rsquo;t you rather take advice from somebody who has achieved, what you
want to achieve? Instead of just proclaiming it?&lt;/p&gt;
&lt;h2 id="his-mentor" class="relative group"&gt;His Mentor &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#his-mentor" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;Rohn talks about all the lessons he learned from his mentor Mr. Shoaff after
he started working at his company.
Shoaff started multiple MLM schemes, to which Rohn contributed.&lt;/p&gt;
&lt;p&gt;MLM is a terrible business model for all, but the people at the top.
You are basically profiting from the losses and labor of the people at the
bottom.&lt;/p&gt;
&lt;p&gt;I wouldn&amp;rsquo;t want to do business like that, and I would be careful with what
the people, who do do business like that, have to say.&lt;/p&gt;
&lt;h2 id="the-positive" class="relative group"&gt;The Positive &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#the-positive" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;I wouldn&amp;rsquo;t be writing this if Jim Rohn didn&amp;rsquo;t have something to offer.
He was a great public speaker and story-teller and is fun to listen to.&lt;/p&gt;
&lt;p&gt;What he really drilled home for me was taking control of my life&amp;rsquo;s
philosophy.
The Slight Edge (the author of which had the idea from Rohn) had already
implanted the idea in me, but with Jim Rohn I understood it more clearly.&lt;/p&gt;
&lt;h2 id="conclusion" class="relative group"&gt;Conclusion &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#conclusion" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;Fun to listen to.
Flexible morals.
Tread with care, especially when it comes to the topic of money.&lt;/p&gt;</description></item><item><title>A coupon and Pareto walk into a bar…</title><link>https://jneidel.com/essay/coupons/</link><pubDate>Tue, 28 May 2024 00:00:00 +0000</pubDate><author>web@jneidel.com (Jonathan Neidel)</author><guid>https://jneidel.com/essay/coupons/</guid><description>&lt;h2 id="10-off1" class="relative group"&gt;10% off!!1! &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#10-off1" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;My grocery store hands me some coupons after every purchase.
50 cents here, 10% there.&lt;/p&gt;
&lt;p&gt;I thought I am so smart for seeing the manipulation:
1) &amp;ldquo;Please come back to our store&amp;rdquo; and 2) &amp;ldquo;Why don&amp;rsquo;t you try something
that you usually don&amp;rsquo;t buy?&amp;rdquo;
Well, you not gonna have any luck with me: 1) I always come to you anyway
and 2) &amp;ldquo;Fresh baked goods&amp;rdquo; and similar categories don&amp;rsquo;t interest me in the
slightest.
I only use the coupons of products I am getting anyway.
So I just save a little on the side.&lt;/p&gt;
&lt;h2 id="wait-where-is-the-problem" class="relative group"&gt;Wait, where is the problem? &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#wait-where-is-the-problem" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;Just the other day got a coupon for &amp;ldquo;10% of cosmetics and cleaning
supplies&amp;rdquo;, so I stockpiled a bit.
Only things I am actually going to use.
My savings: 2.63€.&lt;/p&gt;
&lt;p&gt;And the costs?
Real costs: none.
But, there were the activities that went along with redeeming that coupon:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;At home I thought about which products and approx. how many would make
sense.&lt;/li&gt;
&lt;li&gt;I had to make sure to visit that particular branch before the coupons
expiry date.&lt;/li&gt;
&lt;li&gt;I needed to remind myself to grab the coupon from it&amp;rsquo;s compartment in
the car.&lt;/li&gt;
&lt;li&gt;While in the store I was looking for more matching products and making
sure that the conditions of the coupon were met.&lt;/li&gt;
&lt;li&gt;I needed to remind myself to hand over the coupon at checkout.&lt;/li&gt;
&lt;li&gt;I need to evaluate the new coupon I am presented with afterwards.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Does this sound like a chill shopping trip, where I just mindlessly wander
the store and dump the contents of my shopping list into the cart?&lt;/p&gt;
&lt;p&gt;Is it worth it to cram random unimportant tasks into my brain, just to save
2.63€?&lt;/p&gt;
&lt;p&gt;That is a clear example of low
&lt;abbr title="Return on Investment"&gt;ROI&lt;/abbr&gt;
optimization and is definitely located in the 80% (the less effective part,
which provides just 20% of results) of the 80/20 formula.&lt;/p&gt;
&lt;h2 id="savings-mindset" class="relative group"&gt;Savings mindset &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#savings-mindset" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;How do you become rich?
By reducing your costs?
Sure, you need to control your costs, but solely through austerity you
can&amp;rsquo;t become rich.
Only less poor.&lt;/p&gt;
&lt;p&gt;You need to create value and increase your income.
In most cases that will be the much more effective lever.&lt;/p&gt;
&lt;p&gt;If we assume you aren&amp;rsquo;t living lavishly, then reducing your costs by 300€
is much harder than earning another 300€ extra.
At a certain point cutting costs will lead to (harsh) reductions in quality
of life.&lt;/p&gt;
&lt;p&gt;Back to the coupons.
What are they programming you on?
Poor people mindset.&lt;/p&gt;
&lt;p&gt;You are posing to your brain the question:
&amp;ldquo;How can I keep more of what little money I have?&amp;rdquo; instead of asking
&amp;ldquo;How can I create more value for the world?&amp;rdquo;&lt;/p&gt;
&lt;h2 id="does-this-even-make-a-difference" class="relative group"&gt;Does this even make a difference? &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#does-this-even-make-a-difference" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;I&amp;rsquo;m not gonna stand here and pronounce that ignoring coupons will turn your
life around.
But it&amp;rsquo;s the small things, the small decisions added on top of each other,
which over time can have a big impact.&lt;/p&gt;
&lt;p&gt;The little extra relaxation, with which you leave the supermarket.
The few more moments of awareness, that provide you with a little
satisfaction.
The little less, that your brain concentrates on having Little.&lt;/p&gt;
&lt;p&gt;I have made up my mind.
No more coupons from now on.
They are going directly into the trash, without being considered.&lt;/p&gt;
&lt;h2 id="comprehension-questions--action-steps" class="relative group"&gt;Comprehension questions &amp;amp; Action steps &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#comprehension-questions--action-steps" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Explain in your own words: Why are coupons costing you more than you are
saving with them?&lt;/li&gt;
&lt;li&gt;How are coupons related to the Pareto-principle?&lt;/li&gt;
&lt;li&gt;Can you find examples from your own life, where you are engaging in
activities that on the surface look like a good deal, but that are secretly
costing you?&lt;/li&gt;
&lt;li&gt;Come to a decision about how you are going to approach coupons and
similar deals in the future.&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Neurostreams Quick Reference Guide</title><link>https://jneidel.com/misc/neurostreams-quick-reference/</link><pubDate>Mon, 27 May 2024 00:00:00 +0000</pubDate><author>web@jneidel.com (Jonathan Neidel)</author><guid>https://jneidel.com/misc/neurostreams-quick-reference/</guid><description>&lt;div class="lead !mb-9 text-xl"&gt;
 Overview of all &lt;a href="https://jneidel.com/review/neurostreams/"&gt;Neurostreams&lt;/a&gt; with usage instructions.
&lt;/div&gt;

&lt;p&gt;Recommendation: Familiarize yourself with the &lt;a href="https://jneidel.com/misc/neurostreams-quick-reference/#about-this-page"&gt;emoji descriptors&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="applications" class="relative group"&gt;Applications &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#applications" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;h3 id="to-improve-your-work" class="relative group"&gt;To improve your work &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#to-improve-your-work" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h3&gt;&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Track&lt;/th&gt;
 &lt;th&gt;Effect&lt;/th&gt;
 &lt;th&gt;Application&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;IQ 7000&lt;br&gt;&lt;a href=https://jneidel.com/documents/neurostreams/katalog-en/IQ_7000.pdf class="no-underline" target=_blank&gt;:page_with_curl:&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;Increase attention and focus,&lt;br&gt;reduce emotional distraction and hyperactivity&lt;/td&gt;
 &lt;td&gt;&lt;span class="text-xl"&gt;&lt;abbr class="no-underline" title="Eyes open"&gt;:eye:&lt;/abbr&gt;, &lt;abbr class="no-underline" title="Headphones are required"&gt;:headphone:&lt;/abbr&gt;, &lt;abbr class="no-underline" title="Focus on what you are doing"&gt;:writing_hand:&lt;/abbr&gt;&lt;/span&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Flow meets genius&lt;br&gt;&lt;span class="text-xs"&gt;(Flow trifft Genie)&lt;/span&gt;&lt;br&gt;&lt;a href="https://jneidel.com/documents/neurostreams/katalog-en/Flow_meets_genius-Flow_triff_Genie.pdf" class="no-underline" target=_blank&gt;:page_with_curl:&lt;/a&gt; &lt;a href="https://www.neurostreams.de/portfolio/im-flow/#aff=jneidel" class="no-underline" target=_blank&gt;:earth_africa:&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;Get into flow, increase focus, lift your mood&lt;/td&gt;
 &lt;td&gt;&lt;span class="text-xl"&gt;&lt;abbr class="no-underline" title="Eyes open"&gt;:eye:&lt;/abbr&gt;, &lt;abbr class="no-underline" title="Headphones are recommended"&gt;:headphone:&lt;/abbr&gt;/&lt;abbr class="no-underline" title="Spakers can be used"&gt;:speaker:&lt;/abbr&gt;, &lt;abbr class="no-underline" title="Focus on what you are doing"&gt;:writing_hand:&lt;/abbr&gt;/&lt;abbr class="no-underline" title="You can listen while doing something else"&gt;:person_doing_cartwheel:&lt;/abbr&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Hyperbrainpower&lt;br&gt;&lt;a href=https://jneidel.com/documents/neurostreams/katalog-en/Hyperbrainpower.pdf class="no-underline" target=_blank&gt;:page_with_curl:&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;Increases the ability to concentrate, sharpens the focus, stabilizes emotions&lt;/td&gt;
 &lt;td&gt;&lt;span class="text-xl"&gt;&lt;abbr class="no-underline" title="Eyes open"&gt;:eye:&lt;/abbr&gt;, &lt;abbr class="no-underline" title="Headphones are recommended"&gt;:headphone:&lt;/abbr&gt;/&lt;abbr class="no-underline" title="Spakers can be used"&gt;:speaker:&lt;/abbr&gt;, &lt;abbr class="no-underline" title="Focus on what you are doing"&gt;:writing_hand:&lt;/abbr&gt; &lt;br&gt;&lt;abbr class="no-underline" title="No more than 2x per day"&gt;:arrows_counterclockwise:&lt;abbr&gt;&lt;span class="text-xs"&gt; max 2x/day&lt;span&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Brainstorms&lt;br&gt;&lt;a href=https://jneidel.com/documents/neurostreams/katalog-en/Brainstorms.pdf class="no-underline" target=_blank&gt;:page_with_curl:&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;Generate new ideas&lt;/td&gt;
 &lt;td&gt;&lt;span class="text-xl"&gt;&lt;abbr class="no-underline" title="Eyes open"&gt;:eye:&lt;/abbr&gt;, &lt;abbr class="no-underline" title="Headphones are required"&gt;:headphone:&lt;/abbr&gt;, &lt;abbr class="no-underline" title="Focus on what you are doing"&gt;:writing_hand:&lt;/abbr&gt;&lt;/span&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="to-calm-down" class="relative group"&gt;To calm down &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#to-calm-down" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h3&gt;&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Track&lt;/th&gt;
 &lt;th&gt;Usage&lt;/th&gt;
 &lt;th style="text-align: center"&gt;Target Frequency&lt;/th&gt;
 &lt;th style="text-align: center"&gt;When &lt;span class="text-xs"&gt;(Recommended)&lt;/span&gt;&lt;/th&gt;
 &lt;th&gt;Application&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;Mini Alpha Siesta&lt;br&gt;&lt;span class="text-xs"&gt;(previously: Mini Alpha Breaks)&lt;/span&gt;&lt;br&gt;&lt;a href=https://jneidel.com/documents/neurostreams/katalog-en/Mini_Alpha_Siesta.pdf class="no-underline" target=_blank&gt;:page_with_curl:&lt;/a&gt; &lt;a href="https://www.neurostreams.de/portfolio/alpha-zustand-reset/#aff=jneidel" class="no-underline" target=_blank&gt;:earth_africa:&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;Short, concise relaxation&lt;/td&gt;
 &lt;td style="text-align: center"&gt;10 Hz&lt;/td&gt;
 &lt;td style="text-align: center"&gt;Before or after lunch&lt;/td&gt;
 &lt;td&gt;&lt;span class="text-xl"&gt;&lt;abbr class="no-underline" title="Eyes closed"&gt;:see_no_evil:&lt;/abbr&gt;, &lt;abbr class="no-underline" title="Headphones are required"&gt;:headphone:&lt;/abbr&gt;, &lt;abbr class="no-underline" title="Active listening"&gt;:ear:&lt;/abbr&gt; &lt;abbr class="no-underline text-xl" title="Lie down or get comfortable"&gt;:bed:&lt;/abbr&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Gaia Club Radio&lt;br&gt;&lt;a href=https://jneidel.com/documents/neurostreams/katalog-en/Gaia_Club_Radio.pdf class="no-underline" target=_blank&gt;:page_with_curl:&lt;/a&gt; &lt;a href="https://www.neurostreams.de/portfolio/schumann-frequenz/#aff=jneidel" class="no-underline" target=_blank&gt;:earth_africa:&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;Relaxation between waking and dreaming. Works especially on hyperactivity and nervousness&lt;/td&gt;
 &lt;td style="text-align: center"&gt;7.83 Hz&lt;/td&gt;
 &lt;td style="text-align: center"&gt;Siesta, nap,&lt;br&gt;in the evening&lt;/td&gt;
 &lt;td&gt;&lt;span class="text-xl"&gt;&lt;abbr class="no-underline" title="Eyes closed"&gt;:see_no_evil:&lt;/abbr&gt;, &lt;abbr class="no-underline" title="Headphones are required"&gt;:headphone:&lt;/abbr&gt;, &lt;abbr class="no-underline" title="Active listening"&gt;:ear:&lt;/abbr&gt; &lt;abbr class="no-underline" title="Use a sleeping mask"&gt;:goggles:&lt;/abbr&gt;&lt;span class="text-xs"&gt; Sleeping mask&lt;span&gt; &lt;abbr class="no-underline text-xl" title="Lie down or get comfortable"&gt;:bed:&lt;/abbr&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Wellness Walk&lt;br&gt;&lt;a href=https://jneidel.com/documents/neurostreams/katalog-en/Wellness_Walk.pdf class="no-underline" target=_blank&gt;:page_with_curl:&lt;/a&gt; &lt;a href="https://www.neurostreams.de/portfolio/stress-abbauen/#aff=jneidel" class="no-underline" target=_blank&gt;:earth_africa:&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;With a lot of stress.&lt;br&gt;Completely unwind after the day&lt;/td&gt;
 &lt;td style="text-align: center"&gt;6.5 Hz&lt;/td&gt;
 &lt;td style="text-align: center"&gt;After the day&amp;rsquo;s work is done&lt;/td&gt;
 &lt;td&gt;&lt;span class="text-xl"&gt;&lt;abbr class="no-underline" title="Eyes closed"&gt;:see_no_evil:&lt;/abbr&gt;, &lt;abbr class="no-underline" title="Headphones are required"&gt;:headphone:&lt;/abbr&gt;, &lt;abbr class="no-underline" title="Active listening"&gt;:ear:&lt;/abbr&gt; &lt;abbr class="no-underline" title="Lie down or get comfortable"&gt;:bed:&lt;/abbr&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Planet Relax&lt;br&gt;&lt;a href=https://jneidel.com/documents/neurostreams/katalog-en/Planet_Relax.pdf class="no-underline" target=_blank&gt;:page_with_curl:&lt;/a&gt; &lt;a href="https://www.neurostreams.de/portfolio/tiefe-entspannung-erreichen/#aff=jneidel" class="no-underline" target=_blank&gt;:earth_africa:&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;Shift down a gear and relax effectively&lt;/td&gt;
 &lt;td style="text-align: center"&gt;8.5 Hz&lt;/td&gt;
 &lt;td style="text-align: center"&gt;After the day&amp;rsquo;s work is done&lt;/td&gt;
 &lt;td&gt;&lt;span class="text-xl"&gt;&lt;abbr class="no-underline" title="Eyes closed"&gt;:see_no_evil:&lt;/abbr&gt;, &lt;abbr class="no-underline" title="Headphones are required"&gt;:headphone:&lt;/abbr&gt;, &lt;abbr class="no-underline" title="Lie down or get comfortable"&gt;:bed:&lt;/abbr&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Delta fresh cell treatment&lt;br&gt;&lt;span class="text-xs"&gt;(Delta Frischzellenkur)&lt;/span&gt;&lt;br&gt;&lt;a href="https://jneidel.com/documents/neurostreams/katalog-en/DELTA_fresh_cell_treatment-DELTA_Frischzellenkur.pdf" class="no-underline" target=_blank&gt;:page_with_curl:&lt;/a&gt; &lt;a href="https://www.neurostreams.de/portfolio/sich-erholen/#aff=jneidel" class="no-underline" target=_blank&gt;:earth_africa:&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;Deep regeneration.&lt;br&gt;For physical exhaustion&lt;/td&gt;
 &lt;td style="text-align: center"&gt;1.05 Hz&lt;/td&gt;
 &lt;td style="text-align: center"&gt;On the weekend (without time pressure)&lt;/td&gt;
 &lt;td&gt;&lt;span class="text-xl"&gt;&lt;abbr class="no-underline" title="Eyes closed"&gt;:see_no_evil:&lt;/abbr&gt;, &lt;abbr class="no-underline" title="Headphones are recommended"&gt;:headphone:&lt;/abbr&gt;/&lt;abbr class="no-underline" title="Spakers can be used"&gt;:speaker:&lt;/abbr&gt;, &lt;abbr class="no-underline" title="Active listening"&gt;:ear:&lt;/abbr&gt; &lt;abbr class="no-underline" title="Lie down or get comfortable"&gt;:bed:&lt;/abbr&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Riding the Lion&lt;br&gt;&lt;span class="text-xs"&gt;(Den Löwen reiten)&lt;/span&gt;&lt;br&gt;&lt;a href=https://jneidel.com/documents/neurostreams/katalog-en/Riding_the_Lion.pdf class="no-underline" target=_blank&gt;:page_with_curl:&lt;/a&gt; &lt;a href="https://www.neurostreams.de/produkte/labor/gegen-angst-gegen-beklemmung/#aff=jneidel" class="no-underline" target=_blank&gt;:earth_africa:&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;Calming in case of anxiety, unrest or worry&lt;/td&gt;
 &lt;td style="text-align: center"&gt;8.5 Hz&lt;/td&gt;
 &lt;td style="text-align: center"&gt;Whenever&lt;/td&gt;
 &lt;td&gt;&lt;span class="text-xl"&gt;&lt;abbr class="no-underline" title="Eyes closed"&gt;:see_no_evil:&lt;/abbr&gt;, &lt;abbr class="no-underline" title="Headphones recommended"&gt;:headphone:&lt;/abbr&gt;/&lt;abbr class="no-underline" title="Speakers can be used"&gt;:speaker:&lt;/abbr&gt;, &lt;abbr class="no-underline" title="Active listening"&gt;:ear:&lt;/abbr&gt;, &lt;abbr class="no-underline" title="Don't listen to it multiple times in a row"&gt;:arrows_counterclockwise:&lt;abbr&gt;&lt;span class="text-xs"&gt; not repeatedly&lt;/span&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="meditation" class="relative group"&gt;Meditation &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#meditation" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h3&gt;&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Track&lt;/th&gt;
 &lt;th&gt;Kind&lt;/th&gt;
 &lt;th style="text-align: center"&gt;Target Frequency&lt;/th&gt;
 &lt;th style="text-align: center"&gt;When &lt;span class="text-xs"&gt;(Recommended)&lt;/span&gt;&lt;/th&gt;
 &lt;th&gt;Application&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;DNA Talk&lt;br&gt;&lt;a href=https://jneidel.com/documents/neurostreams/katalog-en/DNA_Talk.pdf class="no-underline" target=_blank&gt;:page_with_curl:&lt;/a&gt; &lt;a href="https://www.neurostreams.de/portfolio/meditieren/#aff=jneidel" class="no-underline" target=_blank&gt;:earth_africa:&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;Meditation&lt;/td&gt;
 &lt;td style="text-align: center"&gt;7 Hz&lt;/td&gt;
 &lt;td style="text-align: center"&gt;Morning, evening&lt;/td&gt;
 &lt;td&gt;&lt;span class="text-xl"&gt;&lt;abbr class="no-underline" title="Eyes closed"&gt;:see_no_evil:&lt;/abbr&gt;, &lt;abbr class="no-underline" title="Headphones are required"&gt;:headphone:&lt;/abbr&gt;, &lt;abbr class="no-underline" title="Active listening"&gt;:ear:&lt;/abbr&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Zen Quasar&lt;br&gt;&lt;a href=https://jneidel.com/documents/neurostreams/katalog-en/Zen_Quasar.pdf class="no-underline" target=_blank&gt;:page_with_curl:&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;Deep meditation&lt;/td&gt;
 &lt;td style="text-align: center"&gt;6.5 Hz&lt;/td&gt;
 &lt;td style="text-align: center"&gt;Morning&lt;/td&gt;
 &lt;td&gt;&lt;span class="text-xl"&gt;&lt;abbr class="no-underline" title="Eyes are half-open"&gt;:eye:&lt;/abbr&gt;&lt;span class="text-xs"&gt; half-open&lt;span&gt;, &lt;span class="text-xl"&gt;&lt;abbr class="no-underline" title="Headphones are required"&gt;:headphone:&lt;/abbr&gt;, &lt;abbr class="no-underline" title="Active listening"&gt;:ear:&lt;/abbr&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Kyoto Dimension&lt;br&gt;&lt;a href=https://jneidel.com/documents/neurostreams/katalog-en/Kyoto_Dimension.pdf class="no-underline" target=_blank&gt;:page_with_curl:&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;Very deep meditation for the advanced&lt;/td&gt;
 &lt;td style="text-align: center"&gt;5.5 Hz&lt;/td&gt;
 &lt;td style="text-align: center"&gt;&lt;/td&gt;
 &lt;td&gt;&lt;span class="text-xl"&gt;&lt;abbr class="no-underline" title="Eyes closed"&gt;:see_no_evil:&lt;/abbr&gt;, &lt;abbr class="no-underline" title="Headphones are required"&gt;:headphone:&lt;/abbr&gt;, &lt;abbr class="no-underline" title="Active listening"&gt;:ear:&lt;/abbr&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Silver thread&lt;br&gt;&lt;span class="text-xs"&gt;(Silberfaden)&lt;/span&gt;&lt;br&gt;&lt;a href="https://jneidel.com/documents/neurostreams/katalog-en/Silver_thread-Silberfaden.pdf" class="no-underline" target=_blank&gt;:page_with_curl:&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;The deepest meditation: on the threshold from dream to dreamless sleep&lt;/td&gt;
 &lt;td style="text-align: center"&gt;4 Hz&lt;/td&gt;
 &lt;td style="text-align: center"&gt;&lt;/td&gt;
 &lt;td&gt;&lt;span class="text-xl"&gt;&lt;abbr class="no-underline" title="Eyes closed"&gt;:see_no_evil:&lt;/abbr&gt;, &lt;abbr class="no-underline" title="Headphones are required"&gt;:headphone:&lt;/abbr&gt;, &lt;abbr class="no-underline" title="Active listening"&gt;:ear:&lt;/abbr&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Return to Eden&lt;br&gt;&lt;span class="text-xs"&gt;(Rückkehr nach Eden; previously: Treffpunkt Garten Eden)&lt;/span&gt;&lt;br&gt;&lt;a href="https://jneidel.com/documents/neurostreams/katalog-en/Return_to_Eden.pdf" class="no-underline" target=_blank&gt;:page_with_curl:&lt;/a&gt; &lt;a href="https://www.neurostreams.de/produkte/labor/gegen-ruhelosigkeit/#aff=jneidel" class="no-underline" target=_blank&gt;:earth_africa:&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;Meditation for people who have difficulty relaxing&lt;/td&gt;
 &lt;td style="text-align: center"&gt;8.5 Hz&lt;/td&gt;
 &lt;td style="text-align: center"&gt;Whenever&lt;/td&gt;
 &lt;td&gt;&lt;span class="text-xl"&gt;&lt;abbr class="no-underline" title="Eyes closed"&gt;:see_no_evil:&lt;/abbr&gt;, &lt;abbr class="no-underline" title="Headphones are required"&gt;:headphone:&lt;/abbr&gt;, &lt;abbr class="no-underline" title="Active listening"&gt;:ear:&lt;/abbr&gt; &lt;abbr class="no-underline" title="Lie down or get comfortable"&gt;:bed:&lt;/abbr&gt;, &lt;br&gt;&lt;abbr class="no-underline" title="Maximum 1x daily"&gt;:arrows_counterclockwise:&lt;abbr&gt;&lt;span class="text-xs"&gt; max 1x/day&lt;/span&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="to-energize-yourself" class="relative group"&gt;To energize yourself &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#to-energize-yourself" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h3&gt;&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Track&lt;/th&gt;
 &lt;th&gt;What&lt;/th&gt;
 &lt;th style="text-align: center"&gt;When &lt;span class="text-xs"&gt;(Recommended)&lt;/span&gt;&lt;/th&gt;
 &lt;th&gt;Application&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;Sturm und Drang&lt;br&gt;&lt;a href=https://jneidel.com/documents/neurostreams/katalog-en/Sturm_und_Drang.pdf class="no-underline" target=_blank&gt;:page_with_curl:&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;For acute listlessness&lt;/td&gt;
 &lt;td style="text-align: center"&gt;After breakfast, after lunch, before going out on the town&lt;/td&gt;
 &lt;td&gt;&lt;span class="text-xl"&gt;&lt;abbr class="no-underline" title="Eyes open"&gt;:eye:&lt;/abbr&gt;, &lt;abbr class="no-underline" title="Headphones are recommended"&gt;:headphone:&lt;/abbr&gt;/&lt;abbr class="no-underline" title="Spakers can be used"&gt;:speaker:&lt;/abbr&gt;, &lt;abbr class="no-underline" title="Active listening"&gt;:ear:&lt;/abbr&gt; &lt;abbr class="no-underline" title="Not distracting activities can be performed simulateously"&gt;:person_doing_cartwheel:&lt;/abbr&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Pure liveliness&lt;br&gt;&lt;span class="text-xs"&gt;(Pure Lebendigkeit)&lt;/span&gt;&lt;br&gt;&lt;a href="https://jneidel.com/documents/neurostreams/katalog-en/Pure_liveliness-Pure_Lebensfreude.pdf" class="no-underline" target=_blank&gt;:page_with_curl:&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;Sturm und Drang on Steroids&lt;/td&gt;
 &lt;td style="text-align: center"&gt;&lt;/td&gt;
 &lt;td&gt;&lt;span class="text-xl"&gt;&lt;abbr class="no-underline" title="Eyes open"&gt;:eye:&lt;/abbr&gt;, &lt;abbr class="no-underline" title="Headphones are recommended"&gt;:headphone:&lt;/abbr&gt;/&lt;abbr class="no-underline" title="Spakers can be used"&gt;:speaker:&lt;/abbr&gt;, &lt;abbr class="no-underline" title="Active listening"&gt;:ear:&lt;/abbr&gt; &lt;abbr class="no-underline" title="Not distracting activities can be performed simulateously"&gt;:person_doing_cartwheel:&lt;/abbr&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Early riser reward&lt;br&gt;&lt;span class="text-xs"&gt;(Frühaufsteherbelohnung)&lt;/span&gt;&lt;br&gt;&lt;a href="https://jneidel.com/documents/neurostreams/katalog-en/Early_riser_reward-Frühaufsteherbelohnung.pdf" class="no-underline" target=_blank&gt;:page_with_curl:&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;General source of energy, for the short burst of energy&lt;/td&gt;
 &lt;td style="text-align: center"&gt;After waking up,&lt;br&gt;while jogging&lt;/td&gt;
 &lt;td&gt;&lt;span class="text-xl"&gt;&lt;abbr class="no-underline" title="Eyes open"&gt;:eye:&lt;/abbr&gt;, &lt;abbr class="no-underline" title="Headphones are required"&gt;:headphone:&lt;/abbr&gt;, &lt;abbr class="no-underline" title="You can listen while doing something else"&gt;:person_doing_cartwheel:&lt;/abbr&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Gamma Hammer&lt;br&gt;&lt;a href=https://jneidel.com/documents/neurostreams/katalog-en/Gamma_Hammer.pdf class="no-underline" target=_blank&gt;:page_with_curl:&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;Extreme, experimental acceleration&lt;/td&gt;
 &lt;td style="text-align: center"&gt;Not for many hours before going to sleep&lt;/td&gt;
 &lt;td&gt;&lt;span class="text-xl"&gt;&lt;abbr class="no-underline" title="Eyes open"&gt;:eye:&lt;/abbr&gt;/&lt;span class="text-xl"&gt;&lt;abbr class="no-underline" title="Eyes closed"&gt;:see_no_evil:&lt;/abbr&gt;, &lt;abbr class="no-underline" title="Headphones are recommended"&gt;:headphone:&lt;/abbr&gt;/&lt;abbr class="no-underline" title="Spakers can be used"&gt;:speaker:&lt;/abbr&gt;, &lt;abbr class="no-underline" title="Active listening"&gt;:ear:&lt;/abbr&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="to-increase-performance-capacity" class="relative group"&gt;To increase performance capacity &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#to-increase-performance-capacity" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h3&gt;&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Track&lt;/th&gt;
 &lt;th&gt;Effect&lt;/th&gt;
 &lt;th style="text-align: center"&gt;When&lt;/th&gt;
 &lt;th&gt;Application&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;Flow meets genius&lt;br&gt;&lt;span class="text-xs"&gt;(Flow trifft Genie)&lt;/span&gt;&lt;br&gt;&lt;a href="https://jneidel.com/documents/neurostreams/katalog-en/Flow_meets_genius-Flow_triff_Genie.pdf" class="no-underline" target=_blank&gt;:page_with_curl:&lt;/a&gt; &lt;a href="https://www.neurostreams.de/portfolio/im-flow/#aff=jneidel" class="no-underline" target=_blank&gt;:earth_africa:&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;Get into flow, increase focus, lift your mood&lt;/td&gt;
 &lt;td style="text-align: center"&gt;Always and everywhere, while walking, in the car&lt;/td&gt;
 &lt;td&gt;&lt;span class="text-xl"&gt;&lt;abbr class="no-underline" title="Eyes open"&gt;:eye:&lt;/abbr&gt;, &lt;abbr class="no-underline" title="Headphones are recommended"&gt;:headphone:&lt;/abbr&gt;/&lt;abbr class="no-underline" title="Spakers can be used"&gt;:speaker:&lt;/abbr&gt;, &lt;abbr class="no-underline" title="Focus on what you are doing"&gt;:writing_hand:&lt;/abbr&gt;/&lt;abbr class="no-underline" title="You can listen while doing something else"&gt;:person_doing_cartwheel:&lt;/abbr&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Cognition Ammunition&lt;br&gt;&lt;span class="text-xs"&gt;(Kognition Munition)&lt;/span&gt;&lt;br&gt;&lt;a href="https://jneidel.com/documents/neurostreams/katalog-en/Cognition_Ammunition-Kognition_Munition.pdf" class="no-underline" target=_blank&gt;:page_with_curl:&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;Brain workout&lt;/td&gt;
 &lt;td style="text-align: center"&gt;Always and everywhere,&lt;br&gt;not before going to sleep&lt;/td&gt;
 &lt;td&gt;&lt;span class="text-xl"&gt;&lt;abbr class="no-underline" title="Eyes open"&gt;:eye:&lt;/abbr&gt;, &lt;abbr class="no-underline" title="Headphones are recommended"&gt;:headphone:&lt;/abbr&gt;/&lt;abbr class="no-underline" title="Spakers can be used"&gt;:speaker:&lt;/abbr&gt;, &lt;abbr class="no-underline" title="You can listen while doing something else"&gt;:person_doing_cartwheel:&lt;/abbr&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;The rest is silence&lt;br&gt;&lt;span class="text-xs"&gt;(Der Rest ist Schweigen)&lt;/span&gt;&lt;br&gt;&lt;a href="https://jneidel.com/documents/neurostreams/katalog-en/The_rest_is_silence-Der_Rest_ist_Schweigen.pdf" class="no-underline" target=_blank&gt;:page_with_curl:&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;Dealing with your own loud and annoying thoughts&lt;/td&gt;
 &lt;td style="text-align: center"&gt;On demand&lt;/td&gt;
 &lt;td&gt;&lt;span class="text-xl"&gt;&lt;abbr class="no-underline" title="Eyes closed"&gt;:see_no_evil:&lt;/abbr&gt;, &lt;abbr class="no-underline" title="Headphones are recommended"&gt;:headphone:&lt;/abbr&gt;/&lt;abbr class="no-underline" title="Spakers can be used"&gt;:speaker:&lt;/abbr&gt;, &lt;br&gt;&lt;abbr class="no-underline" title="Not more than 2x in a row"&gt;:arrows_counterclockwise:&lt;abbr&gt;&lt;span class="text-xs"&gt; max 2x in a row&lt;span&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;The inner child&lt;br&gt;&lt;span class="text-xs"&gt;(Das innere Kind)&lt;/span&gt;&lt;br&gt;&lt;a href="https://jneidel.com/documents/neurostreams/katalog-en/The_inner_child-Das_innere_Kind.pdf" class="no-underline" target=_blank&gt;:page_with_curl:&lt;/a&gt; &lt;a href="https://www.neurostreams.de/portfolio/das-innere-kind/#aff=jneidel" class="no-underline" target=_blank&gt;:earth_africa:&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;Easier access to the subconscious in order to solve/recognize problems&lt;/td&gt;
 &lt;td style="text-align: center"&gt;On demand&lt;/td&gt;
 &lt;td&gt;&lt;span class="text-xl"&gt;&lt;abbr class="no-underline" title="Eyes closed"&gt;:see_no_evil:&lt;/abbr&gt;, &lt;abbr class="no-underline" title="Headphones are recommended"&gt;:headphone:&lt;/abbr&gt;/&lt;abbr class="no-underline" title="Spakers can be used"&gt;:speaker:&lt;/abbr&gt;, &lt;abbr class="no-underline" title="Active listening"&gt;:ear:&lt;/abbr&gt; &lt;abbr class="no-underline" title="Lie down or get comfortable"&gt;:bed:&lt;/abbr&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Chakra³&lt;br&gt;&lt;a href=https://jneidel.com/documents/neurostreams/katalog-en/Chakra.pdf class="no-underline" target=_blank&gt;:page_with_curl:&lt;/a&gt; &lt;a href="https://www.neurostreams.de/produkte/chakra/#aff=jneidel" class="no-underline" target=_blank&gt;:earth_africa:&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;Activate, cleanse and strengthen invisible energy centers&lt;/td&gt;
 &lt;td style="text-align: center"&gt;On demand&lt;/td&gt;
 &lt;td&gt;&lt;span class="text-xl"&gt;&lt;abbr class="no-underline" title="Eyes may be open"&gt;:eye:&lt;/abbr&gt;/&lt;abbr class="no-underline" title="Eyes may be closed"&gt;:see_no_evil:&lt;/abbr&gt;, &lt;abbr class="no-underline" title="Headphones are required"&gt;:headphone:&lt;/abbr&gt;, &lt;abbr class="no-underline" title="Active listening"&gt;:ear:&lt;/abbr&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="to-fall-asleep" class="relative group"&gt;To fall asleep &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#to-fall-asleep" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h3&gt;&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Track&lt;/th&gt;
 &lt;th&gt;What&lt;/th&gt;
 &lt;th style="text-align: center"&gt;When&lt;/th&gt;
 &lt;th&gt;Application&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;Sleeping aids&lt;br&gt;&lt;span class="text-xs"&gt;(Einschlaf-Hilfen)&lt;/span&gt;&lt;br&gt;&lt;a href="https://jneidel.com/documents/neurostreams/katalog-en/Sleep_aids-Einschlafhilfen.pdf" class="no-underline" target=_blank&gt;:page_with_curl:&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;For falling asleep&lt;/td&gt;
 &lt;td style="text-align: center"&gt;While getting into bed, while rolling in bed&lt;/td&gt;
 &lt;td&gt;&lt;span class="text-xl"&gt;&lt;abbr class="no-underline" title="Eyes closed"&gt;:see_no_evil:&lt;/abbr&gt;, &lt;abbr class="no-underline" title="Headphones are possible"&gt;:headphone:&lt;/abbr&gt;/&lt;abbr class="no-underline" title="Spakers can be used"&gt;:speaker:&lt;/abbr&gt;, &lt;abbr class="no-underline" title="While lying in bed"&gt;:bed:&lt;/abbr&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Sleep forcing&lt;br&gt;&lt;span class="text-xs"&gt;(Schlaf-Erzwingung)&lt;/span&gt;&lt;br&gt;&lt;a href="https://jneidel.com/documents/neurostreams/katalog-en/Sleep_forcing-Schlaferzwingung.pdf" class="no-underline" target=_blank&gt;:page_with_curl:&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;In case the sleep aids are not enough&lt;/td&gt;
 &lt;td style="text-align: center"&gt;&lt;/td&gt;
 &lt;td&gt;&lt;span class="text-xl"&gt;&lt;abbr class="no-underline" title="Eyes closed"&gt;:see_no_evil:&lt;/abbr&gt;, &lt;abbr class="no-underline" title="Headphones are required"&gt;:headphone:&lt;/abbr&gt;, &lt;abbr class="no-underline" title="While lying in bed"&gt;:bed:&lt;/abbr&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;The rest is silence&lt;br&gt;&lt;span class="text-xs"&gt;(Der Rest ist Schweigen)&lt;/span&gt;&lt;br&gt;&lt;a href="https://jneidel.com/documents/neurostreams/katalog-en/The_rest_is_silence-Der_Rest_ist_Schweigen.pdf" class="no-underline" target=_blank&gt;:page_with_curl:&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;Dealing with your own loud and annoying thoughts&lt;/td&gt;
 &lt;td style="text-align: center"&gt;When needed&lt;/td&gt;
 &lt;td&gt;&lt;span class="text-xl"&gt;&lt;abbr class="no-underline" title="Eyes closed"&gt;:see_no_evil:&lt;/abbr&gt;, &lt;abbr class="no-underline" title="Headphones are recommended"&gt;:headphone:&lt;/abbr&gt;/&lt;abbr class="no-underline" title="Spakers can be used"&gt;:speaker:&lt;/abbr&gt;, &lt;br&gt;&lt;abbr class="no-underline" title="Not more than 2x in a row"&gt;:arrows_counterclockwise:&lt;abbr&gt;&lt;span class="text-xs"&gt; max 2x in a row&lt;span&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Night sleep training&lt;br&gt;&lt;span class="text-xs"&gt;(Nachtschlaf-Training)&lt;/span&gt;&lt;br&gt;&lt;a href="https://jneidel.com/documents/neurostreams/katalog-en/Night_sleep_training-Nachtschlaftraining.pdf" class="no-underline" target=_blank&gt;:page_with_curl:&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;Reduce insomnia&lt;/td&gt;
 &lt;td style="text-align: center"&gt;During the day!&lt;br&gt;Before noon, rather than in the afternoon&lt;/td&gt;
 &lt;td&gt;&lt;span class="text-xl"&gt;&lt;abbr class="no-underline" title="Eyes closed"&gt;:see_no_evil:&lt;/abbr&gt;, &lt;abbr class="no-underline" title="Headphones are recommended"&gt;:headphone:&lt;/abbr&gt;/&lt;abbr class="no-underline" title="Spakers can be used"&gt;:speaker:&lt;/abbr&gt;, &lt;abbr class="no-underline" title="Lie down or get comfortable"&gt;:bed:&lt;/abbr&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="autosuggestion--visualization" class="relative group"&gt;Autosuggestion &amp;amp; Visualization &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#autosuggestion--visualization" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h3&gt;&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Track&lt;/th&gt;
 &lt;th style="text-align: center"&gt;For&lt;/th&gt;
 &lt;th&gt;Application&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;Co-Creation Galaxy&lt;br&gt;&lt;a href=https://jneidel.com/documents/neurostreams/katalog-en/Co-Creation_Galaxy.pdf class="no-underline" target=_blank&gt;:page_with_curl:&lt;/a&gt; &lt;a href="https://www.neurostreams.de/portfolio/autosuggestion/#aff=jneidel" class="no-underline" target=_blank&gt;:earth_africa:&lt;/a&gt;&lt;/td&gt;
 &lt;td style="text-align: center"&gt;Autosuggestions&lt;/td&gt;
 &lt;td&gt;&lt;span class="text-xl"&gt;&lt;abbr class="no-underline" title="Eyes closed"&gt;:see_no_evil:&lt;/abbr&gt;, &lt;abbr class="no-underline" title="Headphones are recommended"&gt;:headphone:&lt;/abbr&gt;/&lt;abbr class="no-underline" title="Spakers can be used"&gt;:speaker:&lt;/abbr&gt;, &lt;abbr class="no-underline" title="Focus on the suggestions"&gt;:writing_hand:&lt;/abbr&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Looking to the future&lt;br&gt;&lt;span class="text-xs"&gt;(Die Zukunft schauen)&lt;/span&gt;&lt;br&gt;&lt;a href="https://jneidel.com/documents/neurostreams/katalog-en/Looking_to_the_future-Die_Zukunft_schauen.pdf" class="no-underline" target=_blank&gt;:page_with_curl:&lt;/a&gt; &lt;a href="https://www.neurostreams.de/portfolio/visualisieren-manifestieren/#aff=jneidel" class="no-underline" target=_blank&gt;:earth_africa:&lt;/a&gt;&lt;/td&gt;
 &lt;td style="text-align: center"&gt;Visualizations&lt;/td&gt;
 &lt;td&gt;&lt;span class="text-xl"&gt;&lt;abbr class="no-underline" title="Eyes closed"&gt;:see_no_evil:&lt;/abbr&gt;, &lt;abbr class="no-underline" title="Headphones are recommended"&gt;:headphone:&lt;/abbr&gt;/&lt;abbr class="no-underline" title="Spakers can be used"&gt;:speaker:&lt;/abbr&gt;, &lt;abbr class="no-underline" title="Focus on the visualizations"&gt;:writing_hand:&lt;/abbr&gt; &lt;abbr class="no-underline" title="Get comfortable"&gt;:bed:&lt;/abbr&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="special" class="relative group"&gt;Special &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#special" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h3&gt;&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Track&lt;/th&gt;
 &lt;th&gt;Effect&lt;/th&gt;
 &lt;th style="text-align: center"&gt;When&lt;/th&gt;
 &lt;th&gt;Application&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;Blood pressure lock opener&lt;br&gt;&lt;span class="text-xs"&gt;(Blutdruck-Schleusenöffner)&lt;/span&gt;&lt;br&gt;&lt;a href="https://jneidel.com/documents/neurostreams/katalog-en/Blood_pressure_lock_opener-Blutdruck-Schleusenöffner.pdf" class="no-underline" target=_blank&gt;:page_with_curl:&lt;/a&gt; &lt;a href="https://www.neurostreams.de/produkte/blutdruck-senken-ohne-medikamente/#aff=jneidel" class="no-underline" target=_blank&gt;:earth_africa:&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;Lowering blood pressure&lt;/td&gt;
 &lt;td style="text-align: center"&gt;When needed&lt;/td&gt;
 &lt;td&gt;&lt;span class="text-xl"&gt;&lt;abbr class="no-underline" title="Eyes closed"&gt;:see_no_evil:&lt;/abbr&gt;, &lt;abbr class="no-underline" title="Headphones are recommended"&gt;:headphone:&lt;/abbr&gt;/&lt;abbr class="no-underline" title="Spakers can be used"&gt;:speaker:&lt;/abbr&gt;, &lt;abbr class="no-underline" title="Active listening"&gt;:ear:&lt;/abbr&gt; &lt;abbr class="no-underline" title="Lie down or get comfortable"&gt;:bed:&lt;/abbr&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="about-this-page" class="relative group"&gt;About this page &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#about-this-page" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Tracks are grouped by field of application.&lt;/li&gt;
&lt;li&gt;On the name of the track the catalog page and possibly the shop are linked
(if it has more info.)&lt;/li&gt;
&lt;li&gt;Hovern (holding) the mouse over an emoji shows an explanation.&lt;/li&gt;
&lt;li&gt;If you find an error or something is unclear, please let me &lt;a href="mailto:neurostreams@jneidel.com" rel="external"&gt;know&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Emoji explanations&lt;/strong&gt;&lt;/p&gt;
&lt;div class="flex rounded-md bg-primary-100 px-4 py-3 dark:bg-primary-900"&gt;
 &lt;span class="pe-3 text-primary-400"&gt;
 


 &lt;span class="icon relative inline-block align-text-bottom"&gt;
 &lt;svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"&gt;&lt;path fill="currentColor" d="M506.3 417l-213.3-364c-16.33-28-57.54-28-73.98 0l-213.2 364C-10.59 444.9 9.849 480 42.74 480h426.6C502.1 480 522.6 445 506.3 417zM232 168c0-13.25 10.75-24 24-24S280 154.8 280 168v128c0 13.25-10.75 24-23.1 24S232 309.3 232 296V168zM256 416c-17.36 0-31.44-14.08-31.44-31.44c0-17.36 14.07-31.44 31.44-31.44s31.44 14.08 31.44 31.44C287.4 401.9 273.4 416 256 416z"/&gt;&lt;/svg&gt;

 &lt;/span&gt;


 &lt;/span&gt;
 &lt;span class="dark:text-neutral-300"&gt;Ignoring the usage instructions (especially the headphones) will limit or even eliminate the
effectiveness.&lt;/span&gt;
&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Eyes open/Eyes closed?&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span class="text-xl"&gt;&lt;abbr class="no-underline" title="Eyes closed"&gt;:see_no_evil:&lt;/abbr&gt;&lt;/span&gt; Eyes closed&lt;/li&gt;
&lt;li&gt;&lt;span class="text-xl"&gt;&lt;abbr class="no-underline" title="Eyes open"&gt;:eye:&lt;/abbr&gt;&lt;/span&gt; Eyes open&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Headphones/Speakers?&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span class="text-xl"&gt;&lt;abbr class="no-underline" title="Headphones are required"&gt;:headphone:&lt;/abbr&gt;&lt;/span&gt; Headphones have to be used&lt;/li&gt;
&lt;li&gt;&lt;span class="text-xl"&gt;&lt;abbr class="no-underline" title="Headphones are recommended"&gt;:headphone:&lt;/abbr&gt;&lt;/span&gt;/&lt;span class="text-xl"&gt;&lt;abbr class="no-underline" title="Spakers can be used"&gt;:speaker:&lt;/abbr&gt;&lt;/span&gt; Headphones are recommended, but you can use a speaker instead&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;What do I focus on?&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span class="text-xl"&gt;&lt;abbr class="no-underline" title="Active listening"&gt;:ear:&lt;/abbr&gt;&lt;/span&gt; Active listening&lt;/li&gt;
&lt;li&gt;&lt;span class="text-xl"&gt;&lt;abbr class="no-underline" title="Focus on what you are doing"&gt;:writing_hand:&lt;/abbr&gt;&lt;/span&gt; The focus is on the activity you&amp;rsquo;re doing (e.g. working, writing, reading, learning)&lt;/li&gt;
&lt;li&gt;&lt;span class="text-xl"&gt;&lt;abbr class="no-underline" title="You can listen while doing something else"&gt;:person_doing_cartwheel:&lt;/abbr&gt;&lt;/span&gt; The track can be listed to while you do something else&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Rest&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span class="text-xl"&gt;&lt;abbr class="no-underline" title="Lie down or get comfortable"&gt;:bed:&lt;/abbr&gt;&lt;/span&gt; Lie down or get comfortable&lt;/li&gt;
&lt;li&gt;&lt;abbr class="no-underline" title="Maxium 2x daily"&gt;:arrows_counterclockwise:&lt;abbr&gt;&lt;span class="text-xs"&gt; max 2x/day&lt;/span&gt; How often the track should be listened to at most&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Links&lt;/strong&gt; (not explanations, but links containing further information)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;:page_with_curl: Link to the catalogue page&lt;/li&gt;
&lt;li&gt;:earth_africa: Link to the internet page&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="buying-guide" class="relative group"&gt;Buying guide &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#buying-guide" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;This is an overview of all tracks and what bundles they are included in.
Just search for the tracks you want to get.&lt;/p&gt;
&lt;p&gt;It is meant as a companion to the &lt;a href="https://www.neurostreams.de/produkte/#aff=jneidel" rel="external"&gt;product overview page&lt;/a&gt;,
which does not list individual tracks.&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Track&lt;/th&gt;
 &lt;th style="text-align: center"&gt;Individual&lt;/th&gt;
 &lt;th style="text-align: center"&gt;&lt;a href="https://www.neurostreams.de/portfolio/panorama/#aff=jneidel" rel="external"&gt;Panorama&lt;/a&gt;&lt;/th&gt;
 &lt;th style="text-align: center"&gt;&lt;a href="https://www.digistore24.com/product/588998?aff=jneidel" rel="external"&gt;Klassiker&lt;/a&gt;&lt;/th&gt;
 &lt;th style="text-align: center"&gt;&lt;a href="https://www.digistore24.com/product/588981?aff=jneidel" rel="external"&gt;Specials&lt;/a&gt;&lt;/th&gt;
 &lt;th style="text-align: center"&gt;&lt;a href="https://www.neurostreams.de/portfolio/labor/#aff=jneidel" rel="external"&gt;Labor&lt;/a&gt;&lt;/th&gt;
 &lt;th style="text-align: center"&gt;&lt;a href="https://www.neurostreams.de/produkte/neurostreams-alles/#aff=jneidel" rel="external"&gt;Alles&lt;/a&gt;&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;Flow meets genius (Flow trifft Genie)&lt;/td&gt;
 &lt;td style="text-align: center"&gt;&lt;a href="https://www.neurostreams.de/portfolio/im-flow/#aff=jneidel" rel="external"&gt;Yes&lt;/a&gt;&lt;/td&gt;
 &lt;td style="text-align: center"&gt;✅&lt;/td&gt;
 &lt;td style="text-align: center"&gt;✅&lt;/td&gt;
 &lt;td style="text-align: center"&gt;&lt;/td&gt;
 &lt;td style="text-align: center"&gt;&lt;/td&gt;
 &lt;td style="text-align: center"&gt;✅&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Mini Alpha Siesta&lt;/td&gt;
 &lt;td style="text-align: center"&gt;&lt;a href="https://www.neurostreams.de/portfolio/alpha-zustand-reset/#aff=jneidel" rel="external"&gt;Yes&lt;/a&gt;&lt;/td&gt;
 &lt;td style="text-align: center"&gt;✅&lt;/td&gt;
 &lt;td style="text-align: center"&gt;&lt;/td&gt;
 &lt;td style="text-align: center"&gt;&lt;/td&gt;
 &lt;td style="text-align: center"&gt;✅&lt;/td&gt;
 &lt;td style="text-align: center"&gt;✅&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Gaia Club Radio&lt;/td&gt;
 &lt;td style="text-align: center"&gt;&lt;a href="https://www.neurostreams.de/portfolio/schumann-frequenz/#aff=jneidel" rel="external"&gt;Yes&lt;/a&gt;&lt;/td&gt;
 &lt;td style="text-align: center"&gt;&lt;/td&gt;
 &lt;td style="text-align: center"&gt;✅&lt;/td&gt;
 &lt;td style="text-align: center"&gt;&lt;/td&gt;
 &lt;td style="text-align: center"&gt;&lt;/td&gt;
 &lt;td style="text-align: center"&gt;✅&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;DNA Talk&lt;/td&gt;
 &lt;td style="text-align: center"&gt;&lt;a href="https://www.neurostreams.de/portfolio/meditieren/#aff=jneidel" rel="external"&gt;Yes&lt;/a&gt;&lt;/td&gt;
 &lt;td style="text-align: center"&gt;✅&lt;/td&gt;
 &lt;td style="text-align: center"&gt;✅&lt;/td&gt;
 &lt;td style="text-align: center"&gt;&lt;/td&gt;
 &lt;td style="text-align: center"&gt;&lt;/td&gt;
 &lt;td style="text-align: center"&gt;✅&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Wellness Walk&lt;/td&gt;
 &lt;td style="text-align: center"&gt;&lt;a href="https://www.neurostreams.de/portfolio/stress-abbauen/#aff=jneidel" rel="external"&gt;Yes&lt;/a&gt;&lt;/td&gt;
 &lt;td style="text-align: center"&gt;✅&lt;/td&gt;
 &lt;td style="text-align: center"&gt;✅&lt;/td&gt;
 &lt;td style="text-align: center"&gt;&lt;/td&gt;
 &lt;td style="text-align: center"&gt;&lt;/td&gt;
 &lt;td style="text-align: center"&gt;✅&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Delta fresh cell treatment&lt;br&gt;(Delta Frischzellenkur)&lt;/td&gt;
 &lt;td style="text-align: center"&gt;&lt;a href="https://www.neurostreams.de/portfolio/sich-erholen/#aff=jneidel" rel="external"&gt;Yes&lt;/a&gt;&lt;/td&gt;
 &lt;td style="text-align: center"&gt;✅&lt;/td&gt;
 &lt;td style="text-align: center"&gt;✅&lt;/td&gt;
 &lt;td style="text-align: center"&gt;&lt;/td&gt;
 &lt;td style="text-align: center"&gt;&lt;/td&gt;
 &lt;td style="text-align: center"&gt;✅&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Planet Relax&lt;/td&gt;
 &lt;td style="text-align: center"&gt;&lt;a href="https://www.neurostreams.de/portfolio/tiefe-entspannung-erreichen/#aff=jneidel" rel="external"&gt;Yes&lt;/a&gt;&lt;/td&gt;
 &lt;td style="text-align: center"&gt;(&lt;a href="https://jneidel.com/review/neurostreams/#costs"&gt;Free&lt;/a&gt;)&lt;/td&gt;
 &lt;td style="text-align: center"&gt;&lt;/td&gt;
 &lt;td style="text-align: center"&gt;&lt;/td&gt;
 &lt;td style="text-align: center"&gt;✅&lt;/td&gt;
 &lt;td style="text-align: center"&gt;✅&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Return to Eden&lt;br&gt;(Rückkehr nach Eden)&lt;/td&gt;
 &lt;td style="text-align: center"&gt;&lt;a href="https://www.neurostreams.de/portfolio/alpha-zustand-erreichen/#aff=jneidel" rel="external"&gt;Yes&lt;/a&gt;&lt;/td&gt;
 &lt;td style="text-align: center"&gt;✅&lt;/td&gt;
 &lt;td style="text-align: center"&gt;&lt;/td&gt;
 &lt;td style="text-align: center"&gt;&lt;/td&gt;
 &lt;td style="text-align: center"&gt;✅&lt;/td&gt;
 &lt;td style="text-align: center"&gt;✅&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;The inner child (Das innere Kind)&lt;/td&gt;
 &lt;td style="text-align: center"&gt;&lt;a href="https://www.neurostreams.de/portfolio/das-innere-kind/#aff=jneidel" rel="external"&gt;Yes&lt;/a&gt;&lt;/td&gt;
 &lt;td style="text-align: center"&gt;✅&lt;/td&gt;
 &lt;td style="text-align: center"&gt;&lt;/td&gt;
 &lt;td style="text-align: center"&gt;&lt;/td&gt;
 &lt;td style="text-align: center"&gt;✅&lt;/td&gt;
 &lt;td style="text-align: center"&gt;✅&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Co-Creation Galaxy&lt;/td&gt;
 &lt;td style="text-align: center"&gt;&lt;a href="https://www.neurostreams.de/portfolio/autosuggestion/#aff=jneidel" rel="external"&gt;Yes&lt;/a&gt;&lt;/td&gt;
 &lt;td style="text-align: center"&gt;&lt;/td&gt;
 &lt;td style="text-align: center"&gt;✅&lt;/td&gt;
 &lt;td style="text-align: center"&gt;&lt;/td&gt;
 &lt;td style="text-align: center"&gt;&lt;/td&gt;
 &lt;td style="text-align: center"&gt;✅&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Looking to the future&lt;br&gt;(Die Zukunft schauen)&lt;/td&gt;
 &lt;td style="text-align: center"&gt;&lt;a href="https://www.neurostreams.de/portfolio/visualisieren-manifestieren/#aff=jneidel" rel="external"&gt;Yes&lt;/a&gt;&lt;/td&gt;
 &lt;td style="text-align: center"&gt;&lt;/td&gt;
 &lt;td style="text-align: center"&gt;✅&lt;/td&gt;
 &lt;td style="text-align: center"&gt;&lt;/td&gt;
 &lt;td style="text-align: center"&gt;&lt;/td&gt;
 &lt;td style="text-align: center"&gt;✅&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Blood presure lock opener&lt;br&gt;(Blutdruck-Schleusenöffner)&lt;/td&gt;
 &lt;td style="text-align: center"&gt;&lt;a href="https://www.neurostreams.de/produkte/blutdruck-senken-ohne-medikamente/#aff=jneidel" rel="external"&gt;Yes&lt;/a&gt;&lt;/td&gt;
 &lt;td style="text-align: center"&gt;✅&lt;/td&gt;
 &lt;td style="text-align: center"&gt;&lt;/td&gt;
 &lt;td style="text-align: center"&gt;&lt;/td&gt;
 &lt;td style="text-align: center"&gt;✅&lt;/td&gt;
 &lt;td style="text-align: center"&gt;✅&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Chakra³&lt;/td&gt;
 &lt;td style="text-align: center"&gt;&lt;a href="https://www.neurostreams.de/produkte/chakra/#aff=jneidel" rel="external"&gt;Ja&lt;/a&gt;&lt;/td&gt;
 &lt;td style="text-align: center"&gt;&lt;/td&gt;
 &lt;td style="text-align: center"&gt;&lt;/td&gt;
 &lt;td style="text-align: center"&gt;&lt;/td&gt;
 &lt;td style="text-align: center"&gt;&lt;/td&gt;
 &lt;td style="text-align: center"&gt;✅&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Riding the lion&lt;br&gt;(Den Löwen reiten)&lt;/td&gt;
 &lt;td style="text-align: center"&gt;&lt;a href="https://www.neurostreams.de/produkte/labor/gegen-angst-gegen-beklemmung/#aff=jneidel" rel="external"&gt;Ja&lt;/a&gt;&lt;/td&gt;
 &lt;td style="text-align: center"&gt;&lt;/td&gt;
 &lt;td style="text-align: center"&gt;&lt;/td&gt;
 &lt;td style="text-align: center"&gt;&lt;/td&gt;
 &lt;td style="text-align: center"&gt;✅&lt;/td&gt;
 &lt;td style="text-align: center"&gt;✅&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;ZenBox&lt;/strong&gt;&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Track&lt;/th&gt;
 &lt;th style="text-align: center"&gt;&lt;a href="https://www.neurostreams.de/portfolio/panorama/#aff=jneidel" rel="external"&gt;Panorama&lt;/a&gt;&lt;/th&gt;
 &lt;th style="text-align: center"&gt;&lt;a href="https://www.neurostreams.de/portfolio/zenbox/#aff=jneidel" rel="external"&gt;&lt;strong&gt;ZenBox&lt;/strong&gt;&lt;/a&gt;&lt;/th&gt;
 &lt;th style="text-align: center"&gt;&lt;a href="https://www.digistore24.com/product/588998?aff=jneidel" rel="external"&gt;Klassiker&lt;/a&gt;&lt;/th&gt;
 &lt;th style="text-align: center"&gt;&lt;a href="https://www.digistore24.com/product/588981?aff=jneidel" rel="external"&gt;Specials&lt;/a&gt;&lt;/th&gt;
 &lt;th style="text-align: center"&gt;&lt;a href="https://www.neurostreams.de/portfolio/labor/#aff=jneidel" rel="external"&gt;Labor&lt;/a&gt;&lt;/th&gt;
 &lt;th style="text-align: center"&gt;&lt;a href="https://www.neurostreams.de/produkte/neurostreams-alles/#aff=jneidel" rel="external"&gt;Alles&lt;/a&gt;&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;Zen Quasar&lt;/td&gt;
 &lt;td style="text-align: center"&gt;&lt;/td&gt;
 &lt;td style="text-align: center"&gt;✅&lt;/td&gt;
 &lt;td style="text-align: center"&gt;&lt;/td&gt;
 &lt;td style="text-align: center"&gt;✅&lt;/td&gt;
 &lt;td style="text-align: center"&gt;&lt;/td&gt;
 &lt;td style="text-align: center"&gt;✅&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Kyoto Dimension&lt;/td&gt;
 &lt;td style="text-align: center"&gt;&lt;/td&gt;
 &lt;td style="text-align: center"&gt;✅&lt;/td&gt;
 &lt;td style="text-align: center"&gt;&lt;/td&gt;
 &lt;td style="text-align: center"&gt;✅&lt;/td&gt;
 &lt;td style="text-align: center"&gt;&lt;/td&gt;
 &lt;td style="text-align: center"&gt;✅&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Silver thread (Silberfaden)&lt;/td&gt;
 &lt;td style="text-align: center"&gt;&lt;/td&gt;
 &lt;td style="text-align: center"&gt;✅&lt;/td&gt;
 &lt;td style="text-align: center"&gt;&lt;/td&gt;
 &lt;td style="text-align: center"&gt;✅&lt;/td&gt;
 &lt;td style="text-align: center"&gt;&lt;/td&gt;
 &lt;td style="text-align: center"&gt;✅&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;Megabrain Suite&lt;/strong&gt;&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Track&lt;/th&gt;
 &lt;th style="text-align: center"&gt;&lt;a href="https://www.neurostreams.de/portfolio/panorama/#aff=jneidel" rel="external"&gt;Panorama&lt;/a&gt;&lt;/th&gt;
 &lt;th style="text-align: center"&gt;&lt;a href="https://www.neurostreams.de/portfolio/megabrain-suite/#aff=jneidel" rel="external"&gt;&lt;strong&gt;Megabrain Suite&lt;/strong&gt;&lt;/a&gt;&lt;/th&gt;
 &lt;th style="text-align: center"&gt;&lt;a href="https://www.digistore24.com/product/588998?aff=jneidel" rel="external"&gt;Klassiker&lt;/a&gt;&lt;/th&gt;
 &lt;th style="text-align: center"&gt;&lt;a href="https://www.digistore24.com/product/588981?aff=jneidel" rel="external"&gt;Specials&lt;/a&gt;&lt;/th&gt;
 &lt;th style="text-align: center"&gt;&lt;a href="https://www.neurostreams.de/portfolio/labor/#aff=jneidel" rel="external"&gt;Labor&lt;/a&gt;&lt;/th&gt;
 &lt;th style="text-align: center"&gt;&lt;a href="https://www.neurostreams.de/produkte/neurostreams-alles/#aff=jneidel" rel="external"&gt;Alles&lt;/a&gt;&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;IQ 7000&lt;/td&gt;
 &lt;td style="text-align: center"&gt;✅&lt;/td&gt;
 &lt;td style="text-align: center"&gt;✅&lt;/td&gt;
 &lt;td style="text-align: center"&gt;&lt;/td&gt;
 &lt;td style="text-align: center"&gt;✅&lt;/td&gt;
 &lt;td style="text-align: center"&gt;&lt;/td&gt;
 &lt;td style="text-align: center"&gt;✅&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Hyperbrainpower&lt;/td&gt;
 &lt;td style="text-align: center"&gt;&lt;/td&gt;
 &lt;td style="text-align: center"&gt;✅&lt;/td&gt;
 &lt;td style="text-align: center"&gt;&lt;/td&gt;
 &lt;td style="text-align: center"&gt;✅&lt;/td&gt;
 &lt;td style="text-align: center"&gt;&lt;/td&gt;
 &lt;td style="text-align: center"&gt;✅&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Brainstorms&lt;/td&gt;
 &lt;td style="text-align: center"&gt;&lt;/td&gt;
 &lt;td style="text-align: center"&gt;✅&lt;/td&gt;
 &lt;td style="text-align: center"&gt;&lt;/td&gt;
 &lt;td style="text-align: center"&gt;✅&lt;/td&gt;
 &lt;td style="text-align: center"&gt;&lt;/td&gt;
 &lt;td style="text-align: center"&gt;✅&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Cognition Ammunition&lt;br&gt;(Kognition Munition)&lt;/td&gt;
 &lt;td style="text-align: center"&gt;&lt;/td&gt;
 &lt;td style="text-align: center"&gt;✅&lt;/td&gt;
 &lt;td style="text-align: center"&gt;&lt;/td&gt;
 &lt;td style="text-align: center"&gt;✅&lt;/td&gt;
 &lt;td style="text-align: center"&gt;&lt;/td&gt;
 &lt;td style="text-align: center"&gt;✅&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;Antriebswellen&lt;/strong&gt; (Waves that drive you forward)&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Track&lt;/th&gt;
 &lt;th style="text-align: center"&gt;&lt;a href="https://www.neurostreams.de/portfolio/panorama/#aff=jneidel" rel="external"&gt;Panorama&lt;/a&gt;&lt;/th&gt;
 &lt;th style="text-align: center"&gt;&lt;a href="https://www.neurostreams.de/portfolio/antriebswellen/#aff=jneidel" rel="external"&gt;&lt;strong&gt;Antriebswellen&lt;/strong&gt;&lt;/a&gt;&lt;/th&gt;
 &lt;th style="text-align: center"&gt;&lt;a href="https://www.digistore24.com/product/588998?aff=jneidel" rel="external"&gt;Klassiker&lt;/a&gt;&lt;/th&gt;
 &lt;th style="text-align: center"&gt;&lt;a href="https://www.digistore24.com/product/588981?aff=jneidel" rel="external"&gt;Specials&lt;/a&gt;&lt;/th&gt;
 &lt;th style="text-align: center"&gt;&lt;a href="https://www.neurostreams.de/portfolio/labor/#aff=jneidel" rel="external"&gt;Labor&lt;/a&gt;&lt;/th&gt;
 &lt;th style="text-align: center"&gt;&lt;a href="https://www.neurostreams.de/produkte/neurostreams-alles/#aff=jneidel" rel="external"&gt;Alles&lt;/a&gt;&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;Sturm und Drang&lt;/td&gt;
 &lt;td style="text-align: center"&gt;&lt;/td&gt;
 &lt;td style="text-align: center"&gt;✅&lt;/td&gt;
 &lt;td style="text-align: center"&gt;&lt;/td&gt;
 &lt;td style="text-align: center"&gt;✅&lt;/td&gt;
 &lt;td style="text-align: center"&gt;&lt;/td&gt;
 &lt;td style="text-align: center"&gt;✅&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Pure liveliness&lt;br&gt;(Pure Lebensfreude)&lt;/td&gt;
 &lt;td style="text-align: center"&gt;&lt;/td&gt;
 &lt;td style="text-align: center"&gt;✅&lt;/td&gt;
 &lt;td style="text-align: center"&gt;&lt;/td&gt;
 &lt;td style="text-align: center"&gt;✅&lt;/td&gt;
 &lt;td style="text-align: center"&gt;&lt;/td&gt;
 &lt;td style="text-align: center"&gt;✅&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Early riser reward&lt;br&gt;(Frühaufsteherbelohung)&lt;/td&gt;
 &lt;td style="text-align: center"&gt;&lt;/td&gt;
 &lt;td style="text-align: center"&gt;✅&lt;/td&gt;
 &lt;td style="text-align: center"&gt;&lt;/td&gt;
 &lt;td style="text-align: center"&gt;✅&lt;/td&gt;
 &lt;td style="text-align: center"&gt;&lt;/td&gt;
 &lt;td style="text-align: center"&gt;✅&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Gamma Hammer&lt;/td&gt;
 &lt;td style="text-align: center"&gt;✅&lt;/td&gt;
 &lt;td style="text-align: center"&gt;✅&lt;/td&gt;
 &lt;td style="text-align: center"&gt;&lt;/td&gt;
 &lt;td style="text-align: center"&gt;✅&lt;/td&gt;
 &lt;td style="text-align: center"&gt;&lt;/td&gt;
 &lt;td style="text-align: center"&gt;✅&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;Schlafgold&lt;/strong&gt; (Sleeping gold)&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Track&lt;/th&gt;
 &lt;th style="text-align: center"&gt;&lt;a href="https://www.neurostreams.de/portfolio/panorama/#aff=jneidel" rel="external"&gt;Panorama&lt;/a&gt;&lt;/th&gt;
 &lt;th style="text-align: center"&gt;&lt;a href="https://www.neurostreams.de/portfolio/schlafhilfe/#aff=jneidel" rel="external"&gt;&lt;strong&gt;Schlafgold&lt;/strong&gt;&lt;/a&gt;&lt;/th&gt;
 &lt;th style="text-align: center"&gt;&lt;a href="https://www.digistore24.com/product/588998?aff=jneidel" rel="external"&gt;Klassiker&lt;/a&gt;&lt;/th&gt;
 &lt;th style="text-align: center"&gt;&lt;a href="https://www.digistore24.com/product/588981?aff=jneidel" rel="external"&gt;Specials&lt;/a&gt;&lt;/th&gt;
 &lt;th style="text-align: center"&gt;&lt;a href="https://www.neurostreams.de/portfolio/labor/#aff=jneidel" rel="external"&gt;Labor&lt;/a&gt;&lt;/th&gt;
 &lt;th style="text-align: center"&gt;&lt;a href="https://www.neurostreams.de/produkte/neurostreams-alles/#aff=jneidel" rel="external"&gt;Alles&lt;/a&gt;&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;The rest is silence&lt;br&gt;(Der Rest ist Schweigen)&lt;/td&gt;
 &lt;td style="text-align: center"&gt;✅&lt;/td&gt;
 &lt;td style="text-align: center"&gt;✅&lt;/td&gt;
 &lt;td style="text-align: center"&gt;&lt;/td&gt;
 &lt;td style="text-align: center"&gt;✅&lt;/td&gt;
 &lt;td style="text-align: center"&gt;&lt;/td&gt;
 &lt;td style="text-align: center"&gt;✅&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Sleeping aids&lt;br&gt;(Einschlaf-Hilfen)&lt;/td&gt;
 &lt;td style="text-align: center"&gt;&lt;/td&gt;
 &lt;td style="text-align: center"&gt;✅&lt;/td&gt;
 &lt;td style="text-align: center"&gt;&lt;/td&gt;
 &lt;td style="text-align: center"&gt;✅&lt;/td&gt;
 &lt;td style="text-align: center"&gt;&lt;/td&gt;
 &lt;td style="text-align: center"&gt;✅&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Sleep forcing&lt;br&gt;(Schlaf-Erzwingung)&lt;/td&gt;
 &lt;td style="text-align: center"&gt;&lt;/td&gt;
 &lt;td style="text-align: center"&gt;✅&lt;/td&gt;
 &lt;td style="text-align: center"&gt;&lt;/td&gt;
 &lt;td style="text-align: center"&gt;✅&lt;/td&gt;
 &lt;td style="text-align: center"&gt;&lt;/td&gt;
 &lt;td style="text-align: center"&gt;✅&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Night sleep training&lt;br&gt;(Nachschlaf-Training)&lt;/td&gt;
 &lt;td style="text-align: center"&gt;&lt;/td&gt;
 &lt;td style="text-align: center"&gt;✅&lt;/td&gt;
 &lt;td style="text-align: center"&gt;&lt;/td&gt;
 &lt;td style="text-align: center"&gt;✅&lt;/td&gt;
 &lt;td style="text-align: center"&gt;&lt;/td&gt;
 &lt;td style="text-align: center"&gt;✅&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;</description></item><item><title>Eat the Frog first</title><link>https://jneidel.com/essay/eat-that-frog/</link><pubDate>Fri, 24 May 2024 00:00:00 +0000</pubDate><author>web@jneidel.com (Jonathan Neidel)</author><guid>https://jneidel.com/essay/eat-that-frog/</guid><description>&lt;p class="dropcap"&gt;The principle is simple.
Start every day with the most challenging and important task (the slimy
frog.)
The consequent application of that principle is not as easy.
It takes attention to work out what the most important task is.
It takes discipline to not simply start with an easier, less important task.&lt;/p&gt;
&lt;p&gt;To face the worst that the day has in store for you head-on feels great
though.
You know that everything that comes after, will be easier.
You proved to yourself, that you&amp;rsquo;re somebody who follows through and tackles
what&amp;rsquo;s most important.
You already know that it&amp;rsquo;s going to be a good day.
Everything else that you&amp;rsquo;re doing will just be on-top!&lt;/p&gt;
&lt;p&gt;The principle brings clarity, by forcing you to consider: &amp;ldquo;What even is the
most important thing for me to work on?&amp;rdquo;
This knowledge will put in stark contrast the things that are not.
It allows you, even on days that you don&amp;rsquo;t start by eating the frog, to
recognize that you have been working on unimportant things.
That awareness gives you the opportunity to turn the day around.&lt;/p&gt;
&lt;p&gt;If the picture of &amp;ldquo;Eating the frog&amp;rdquo; gives you a sour taste you can
replace it with a more friendly &amp;ldquo;Kiss the frog first.&amp;rdquo;&lt;/p&gt;
&lt;div class="flex flex-row justify-center items-start gap-2 [&amp;&gt;*]:min-w-0
 "&gt;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 &lt;figure class="w-11/12 mx-auto my-0 rounded-sm"&gt;
 
 
 
 
 
 
 
 
 
 
 
 
 
 &lt;picture
 class="w-11/12 mx-auto my-0 rounded-sm"
 
 &gt;
 
 
 
 
 
 &lt;source
 
 srcset="https://jneidel.com/essay/eat-that-frog/eat-that-frog_hu_a765e4fe8ccd29a9.webp 330w,/essay/eat-that-frog/eat-that-frog_hu_fc48450c00111903.webp 660w
 
 
 ,/essay/eat-that-frog/eat-that-frog_hu_d904be3b7f2ef78a.webp 1024w
 
 
 
 
 ,/essay/eat-that-frog/eat-that-frog_hu_d904be3b7f2ef78a.webp 1024w
 
 "
 
 sizes="100vw"
 type="image/webp"
 /&gt;
 
 &lt;img
 width="1024"
 height="1024"
 class="w-11/12 mx-auto my-0 rounded-sm"
 alt="A frog on a plate in front of you"
 loading="lazy" decoding="async"
 
 
 src="https://jneidel.com/essay/eat-that-frog/eat-that-frog_hu_9dd858279a51b2c2.jpeg"
 srcset="https://jneidel.com/essay/eat-that-frog/eat-that-frog_hu_433cd3468b72bb4b.jpeg 330w,/essay/eat-that-frog/eat-that-frog_hu_9dd858279a51b2c2.jpeg 660w
 
 ,/essay/eat-that-frog/eat-that-frog.jpeg 1024w
 
 
 ,/essay/eat-that-frog/eat-that-frog.jpeg 1024w
 "
 sizes="100vw"
 
 /&gt;
 &lt;/picture&gt;
 
 
 
 &lt;figcaption class="text-center"&gt;Eat the frog&lt;/figcaption&gt;
 &lt;/figure&gt;
 

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 &lt;figure class="w-11/12 mx-auto my-0 rounded-sm"&gt;
 
 
 
 
 
 
 
 
 
 
 
 
 
 &lt;picture
 class="w-11/12 mx-auto my-0 rounded-sm"
 
 &gt;
 
 
 
 
 
 &lt;source
 
 srcset="https://jneidel.com/essay/eat-that-frog/kiss-the-frog-first_hu_c4986313291c5dc9.webp 330w,/essay/eat-that-frog/kiss-the-frog-first_hu_83cf5030e43b5bc3.webp 660w
 
 
 ,/essay/eat-that-frog/kiss-the-frog-first_hu_b9c973ff080a179d.webp 1024w
 
 
 
 
 ,/essay/eat-that-frog/kiss-the-frog-first_hu_b9c973ff080a179d.webp 1024w
 
 "
 
 sizes="100vw"
 type="image/webp"
 /&gt;
 
 &lt;img
 width="1024"
 height="1024"
 class="w-11/12 mx-auto my-0 rounded-sm"
 alt="Man kisses a frog in a pond"
 loading="lazy" decoding="async"
 
 
 src="https://jneidel.com/essay/eat-that-frog/kiss-the-frog-first_hu_5d7bb4a839537e35.jpeg"
 srcset="https://jneidel.com/essay/eat-that-frog/kiss-the-frog-first_hu_a91296a247c1a0cf.jpeg 330w,/essay/eat-that-frog/kiss-the-frog-first_hu_5d7bb4a839537e35.jpeg 660w
 
 ,/essay/eat-that-frog/kiss-the-frog-first.jpeg 1024w
 
 
 ,/essay/eat-that-frog/kiss-the-frog-first.jpeg 1024w
 "
 sizes="100vw"
 
 /&gt;
 &lt;/picture&gt;
 
 
 
 &lt;figcaption class="text-center"&gt;Kiss the frog&lt;/figcaption&gt;
 &lt;/figure&gt;
 


&lt;/div&gt;

&lt;h2 id="apply-it" class="relative group"&gt;Apply it &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#apply-it" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;An idea is nothing without being applied.&lt;/strong&gt;
My clear recommendation:
Try it for a week.
It&amp;rsquo;s a reasonable commitment.
Nothing can go wrong.
See how it feels.
This is exactly what I do in my &lt;a href="https://jneidel.com/project/challenges/"&gt;weekly challenge&lt;/a&gt;
format.&lt;/p&gt;
&lt;p&gt;Ask yourself every morning:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;What is the hardest, most challenging and important task to tackle for a
productive start into the day?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="references" class="relative group"&gt;References &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#references" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;This principle originates from Brian Tracy&amp;rsquo;s &lt;a href="https://www.amazon.com/Eat-That-Frog-Great-Procrastinating/dp/162656941X" rel="external"&gt;Eat That Frog!&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Writing every day for 365 days</title><link>https://jneidel.com/project/writing-365/</link><pubDate>Thu, 23 May 2024 00:00:00 +0000</pubDate><author>web@jneidel.com (Jonathan Neidel)</author><guid>https://jneidel.com/project/writing-365/</guid><description>&lt;span class="flex flex-col"&gt;
 &lt;span class="flex mb-2"&gt;
 &lt;span class="text-sm"&gt;Project start:&lt;/span&gt;
 &lt;span class="flex"&gt;
 &lt;span
 class="ms-1 rounded-md border border-primary-400 px-1 py-[1px] text-xs font-normal text-primary-700 dark:border-primary-600 dark:text-primary-400"
 &gt;
 
 May23 2024
 
 &lt;/span&gt;
&lt;/span&gt;


 &lt;/span&gt;
 &lt;span class="flex"&gt;
 &lt;span class="text-sm"&gt;Offical project end:&lt;/span&gt;
 &lt;span class="flex"&gt;
 &lt;span
 class="ms-1 rounded-md border border-primary-400 px-1 py-[1px] text-xs font-normal text-primary-700 dark:border-primary-600 dark:text-primary-400"
 &gt;
 
 Nov17 2024
 
 &lt;/span&gt;
&lt;/span&gt;


 &lt;/span&gt;
&lt;/span&gt;
&lt;p&gt;This project was &lt;a href="https://jneidel.com/project-status/aborted/"&gt;aborted&lt;/a&gt; (i.e. the 


Project was stopped before completion.)
See &lt;a href="https://jneidel.com/project/writing-365/#challenge-conclusion"&gt;my conclusion&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="challenge-definition" class="relative group"&gt;Challenge definition &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#challenge-definition" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;I have decided to commit myself and take my writing to the next level.
The challenge is: 365 days of writing every day.&lt;/p&gt;
&lt;p&gt;No off-days. No excuses.&lt;/p&gt;
&lt;p&gt;This challenge was inspired by Andy: &lt;a href="https://killyourinnerloser.com/challenge-start-a-365-day-project/" rel="external"&gt;CHALLENGE: Start a 365 Day Project&lt;/a&gt; and
a this &lt;a href="https://www.listennotes.com/podcasts/kill-your-inner/365-day-projects-are-amazing-ZgEoY2xBrJk/" rel="external"&gt;more in-depth podcast episode&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id="intent" class="relative group"&gt;Intent &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#intent" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h3&gt;&lt;p&gt;I want to get better at writing.
Doing something every day is a very effective way of getting better at
something.&lt;/p&gt;
&lt;p&gt;I have a vision of this website in my mind that I want to bring to life.
That requires a lot of writing.
I want to spend this time working through my huge backlog of articles and
build traction for this site.&lt;/p&gt;
&lt;p&gt;I thoroughly enjoyed writing my thesis in uni and have known since
that I want to make this practice a regular part of my life.&lt;/p&gt;
&lt;h3 id="definition-of-writing" class="relative group"&gt;Definition of Writing &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#definition-of-writing" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h3&gt;&lt;p&gt;I am a person that needs clear rules.
Uncertainty about what I can and can&amp;rsquo;t do leads me to indecision and abusing loopholes.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;§1 Writing means writing something that will be used on this website.&lt;/li&gt;
&lt;li&gt;§2 &lt;strong&gt;The minimum is one usable paragraph.&lt;/strong&gt;
It does not matter if the paragraph ends up being used.
The intention should be that it will be.
A note or rough draft does not count.
&lt;ul&gt;
&lt;li&gt;a) Process-appropriate &lt;em&gt;translation&lt;/em&gt; work is a suitable alternative.
&lt;strong&gt;The minimum for translation is a whole article&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;b) Late-stage &lt;em&gt;editing&lt;/em&gt; is another alternative.
&lt;strong&gt;The minimum for editing is bringing an article from the editing phase to publication.&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;§3 Writing needs to happen on some article that is in the pipeline, not
just: &amp;ldquo;Oh yeah, I wrote this note that will become an article later.&amp;rdquo;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="daily-log" class="relative group"&gt;Daily log &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#daily-log" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h3&gt;&lt;p&gt;This is the log, of what I wrote each day.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Wrote this article.&lt;/li&gt;
&lt;li&gt;Finished writing &lt;a href="https://jneidel.com/essay/eat-that-frog/"&gt;Eat the frog&lt;/a&gt;, edit and translate it.
Started writing The Inner Game review.&lt;/li&gt;
&lt;li&gt;Continued writing and editing &lt;a href="https://jneidel.com/de/review/the-inner-game/"&gt;The Inner Game review&lt;/a&gt;&lt;sup&gt;:de:&lt;/sup&gt;.&lt;/li&gt;
&lt;li&gt;Started writing on a post about vulnerability.&lt;/li&gt;
&lt;li&gt;Wrote first version of the &lt;a href="https://jneidel.com/misc/neurostreams-quick-reference/"&gt;Neurostreams quick reference guide&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Wrote &amp;amp; published the &lt;a href="https://jneidel.com/essay/coupons/"&gt;coupons&lt;/a&gt; essay in German.&lt;/li&gt;
&lt;li&gt;Put finishing touches on &lt;a href="https://jneidel.com/essay/coupons/"&gt;coupons&lt;/a&gt;. Started on Neurostreams review.&lt;/li&gt;
&lt;li&gt;Wrote &amp;amp; published &lt;a href="https://jneidel.com/de/review/sun-minimeal/"&gt;Minimeal review&lt;/a&gt;&lt;sup&gt;:de:&lt;/sup&gt;. Updates to &lt;a href="https://jneidel.com/de/misc/soil-verkaufen/"&gt;Selling SOIL&lt;/a&gt;&lt;sup&gt;:de:&lt;/sup&gt;.&lt;/li&gt;
&lt;li&gt;Started on &lt;a href="https://jneidel.com/review/jim-rohn/"&gt;Jim Rohn review&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Finished the &lt;a href="https://jneidel.com/review/jim-rohn/"&gt;Jim Rohn&lt;/a&gt; person review.&lt;/li&gt;
&lt;li&gt;Continued writing the &lt;a href="https://jneidel.com/review/neurostreams/"&gt;Neurostreams review&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Final version of the &lt;a href="https://jneidel.com/misc/neurostreams-quick-reference/"&gt;Neurostreams quick reference guide&lt;/a&gt;. Translated it as well.&lt;/li&gt;
&lt;li&gt;Translated the &lt;a href="https://jneidel.com/essay/coupons/"&gt;coupons&lt;/a&gt; essay.&lt;/li&gt;
&lt;li&gt;Some corrections, reworked and expanded the &lt;a href="https://jneidel.com/review/intermittent-fasting/"&gt;intermittent fasting&lt;/a&gt; review.&lt;/li&gt;
&lt;li&gt;Collect sources for intermittent fasting, add maintenance paragraph to
&lt;a href="https://jneidel.com/review/air-purifier/"&gt;air purifier&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Continue on &lt;a href="https://jneidel.com/review/neurostreams/"&gt;Neurostreams review&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Continue on &lt;a href="https://jneidel.com/review/neurostreams/"&gt;Neurostreams review&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;:slightly_frowning_face:&lt;/li&gt;
&lt;li&gt;Started on waves essay.&lt;/li&gt;
&lt;li&gt;Continued on waves essay.&lt;/li&gt;
&lt;li&gt;Wrote my &lt;a href="https://jneidel.com/now/"&gt;now page&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Make headway on &lt;a href="https://jneidel.com/review/neurostreams/"&gt;Neurostreams review&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Editing first half of the &lt;a href="https://jneidel.com/review/neurostreams/"&gt;Neurostreams review&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Add buying guide and do some editing on &lt;a href="https://jneidel.com/misc/neurostreams-quick-reference/"&gt;Neurostreams quick reference guide&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Write introduction to &lt;a href="https://jneidel.com/project/challenges/"&gt;challenges&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Edit first half of &lt;a href="https://jneidel.com/review/neurostreams/"&gt;Neurostreams review&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Continue editing/rewriting &lt;a href="https://jneidel.com/review/neurostreams/"&gt;Neurostreams review&lt;/a&gt; a little.&lt;/li&gt;
&lt;li&gt;Write first draft of &lt;a href="https://jneidel.com/essay/no-interrupting/"&gt;No interrupting&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Finish editing the second half of the &lt;a href="https://jneidel.com/review/neurostreams/"&gt;Neurostreams review&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Final edits and publishing of &lt;a href="https://jneidel.com/review/neurostreams/"&gt;Neurostreams review&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Write first draft of &lt;a href="https://jneidel.com/de/review/blutspende/"&gt;donating blood review&lt;/a&gt;&lt;sup&gt;:de:&lt;/sup&gt;.&lt;/li&gt;
&lt;li&gt;Finish &lt;a href="https://jneidel.com/de/review/blutspende/"&gt;donating blood analysis&lt;/a&gt;&lt;sup&gt;:de:&lt;/sup&gt;. Write offer technical evaluation. Translate first half of &lt;a href="https://jneidel.com/review/neurostreams/"&gt;Neurostreams review&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Translate the second half of &lt;a href="https://jneidel.com/review/neurostreams/"&gt;Neurostreams review&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Small addition to &lt;a href="https://jneidel.com/essay/no-interrupting/"&gt;no interrupting&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Start project article about entrepreneurship.&lt;/li&gt;
&lt;li&gt;Expand the project article about entrepreneurship in scope.&lt;/li&gt;
&lt;li&gt;Significantly expand &lt;a href="https://jneidel.com/essay/no-interrupting/"&gt;no interrupting&lt;/a&gt; essay.&lt;/li&gt;
&lt;li&gt;Started writing on Trading on Coporate Earnings review.&lt;/li&gt;
&lt;li&gt;Significantly expand &lt;a href="https://jneidel.com/essay/no-interrupting/"&gt;no interrupting&lt;/a&gt; essay.&lt;/li&gt;
&lt;li&gt;Wrote a little on the entrepreneurship article.&lt;/li&gt;
&lt;li&gt;Wrote a little on &lt;a href="https://jneidel.com/essay/no-interrupting/"&gt;no interrupting&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Started writing on Trading on Coporate Earnings review.&lt;/li&gt;
&lt;li&gt;Expanded &amp;amp; edited a good chunk of &lt;a href="https://jneidel.com/essay/no-interrupting/"&gt;no interrupting&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Greatly expanded the Trading on Coporate Earnings review.&lt;/li&gt;
&lt;li&gt;Finish and publish Trading on Coporate Earnings review.&lt;/li&gt;
&lt;li&gt;Expand Trading on Coporate Earnings review. Update german SOIL selling guide.&lt;/li&gt;
&lt;li&gt;Final edits on &lt;a href="https://jneidel.com/essay/no-interrupting/"&gt;no interrupting&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Wrote first half of trampoline jumping review.&lt;/li&gt;
&lt;li&gt;Wrote second half of trampoline jumping review.&lt;/li&gt;
&lt;li&gt;Final editing on trampoline jumping review.&lt;/li&gt;
&lt;li&gt;Publish trampoline review. Publish &lt;a href="https://jneidel.com/essay/no-interrupting/"&gt;no interrupting&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Start writing &lt;a href="https://jneidel.com/review/aws/"&gt;AWS review&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Continued writing &lt;a href="https://jneidel.com/review/aws/"&gt;AWS review&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Published &lt;a href="https://jneidel.com/review/aws/"&gt;AWS review&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Start writing essay on how to be miserable.&lt;/li&gt;
&lt;li&gt;Continue how to be miserable. Start writing article on changing internet providers.&lt;/li&gt;
&lt;li&gt;Continue writing on changing internet providers.&lt;/li&gt;
&lt;li&gt;Write a tiny bit more on changing internet providers.&lt;/li&gt;
&lt;li&gt;Edit and restructure changing internet providers article.&lt;/li&gt;
&lt;li&gt;Publish changing internet providers. Correct mistakes on 3 articles. Slightly expand &lt;a href="https://jneidel.com/review/aws/"&gt;AWS review&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Structure and start writing on GbR project.&lt;/li&gt;
&lt;li&gt;Continue on GbR project.&lt;/li&gt;
&lt;li&gt;Write a little on GbR project.&lt;/li&gt;
&lt;li&gt;Continue on GbR project. Write &lt;a href="https://jneidel.com/de/review/fyrst/"&gt;FYRST review&lt;/a&gt;&lt;sup&gt;:de:&lt;/sup&gt;.&lt;/li&gt;
&lt;li&gt;Describe learnings of this challenge. Write the &lt;a href="https://jneidel.com/newsletter/hemingway-trick/"&gt;1. Newsletter&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Continue a little on GbR project.&lt;/li&gt;
&lt;li&gt;Continue write the GbR project.&lt;/li&gt;
&lt;li&gt;Write an essay on &lt;a href="https://jneidel.com/essay/dont/"&gt;negating commands&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Write on technical documentation project.&lt;/li&gt;
&lt;li&gt;Write a little on GbR project.&lt;/li&gt;
&lt;li&gt;Rules are there as a guide to push you in the right direction.
If a rule does not push you in the right direction, it&amp;rsquo;s not a rule it&amp;rsquo;s an
impediment. – I&amp;rsquo;m just tired after preparing and driving all day. I could
get my one paragraph in, as I did yesterday, but it was and would be sub par.&lt;/li&gt;
&lt;li&gt;Start NLP23 review.&lt;/li&gt;
&lt;li&gt;:books: :student: Full day at NLP Seminar&lt;/li&gt;
&lt;li&gt;:books: :student:&lt;/li&gt;
&lt;li&gt;:books: :student:&lt;/li&gt;
&lt;li&gt;:books: :student:&lt;/li&gt;
&lt;li&gt;:books: :student:&lt;/li&gt;
&lt;li&gt;:books: :student:&lt;/li&gt;
&lt;li&gt;:books: :student:&lt;/li&gt;
&lt;li&gt;Continue NLP23 review. Start writing hypnosis for coaching.&lt;/li&gt;
&lt;li&gt;Continue NLP23 review.&lt;/li&gt;
&lt;li&gt;:face_with_thermometer: Sick&lt;/li&gt;
&lt;li&gt;:face_with_thermometer:&lt;/li&gt;
&lt;li&gt;:face_with_thermometer:&lt;/li&gt;
&lt;li&gt;:face_with_thermometer:&lt;/li&gt;
&lt;li&gt;:face_with_thermometer:&lt;/li&gt;
&lt;li&gt;:face_with_thermometer:&lt;/li&gt;
&lt;li&gt;:face_with_thermometer:&lt;/li&gt;
&lt;li&gt;Continue NLP23 review.&lt;/li&gt;
&lt;li&gt;Continue NLP23 review.&lt;/li&gt;
&lt;li&gt;:face_with_thermometer:&lt;/li&gt;
&lt;li&gt;:face_with_thermometer:&lt;/li&gt;
&lt;li&gt;:slightly_frowning_face:&lt;/li&gt;
&lt;li&gt;Continue NLP23 review.&lt;/li&gt;
&lt;li&gt;Write &lt;a href="https://jneidel.com/newsletter/presence-in-daily-life/"&gt;newsletter #2&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Finish up writing NLP23 review. Start &lt;a href="https://jneidel.com/review/oladance-open-ear-headphones/"&gt;Oladance open ear review&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Finish up editing &lt;a href="https://jneidel.com/review/oladance-open-ear-headphones/"&gt;Oladance open ear review&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Write newsletter signup texts.&lt;/li&gt;
&lt;li&gt;Rework and improve &lt;a href="https://jneidel.com/guide/collect-website-feedback/"&gt;collect website feedback&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Translate und update &lt;a href="https://jneidel.com/now/"&gt;now&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Start &lt;a href="https://jneidel.com/newsletter/effects-of-formal-clothing/"&gt;newsletter #3&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Publish &lt;a href="https://jneidel.com/newsletter/effects-of-formal-clothing/"&gt;newsletter #3&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Continue on technical documentation project.&lt;/li&gt;
&lt;li&gt;Continue on technical documentation project.&lt;/li&gt;
&lt;li&gt;:slightly_frowning_face:&lt;/li&gt;
&lt;li&gt;:slightly_frowning_face:&lt;/li&gt;
&lt;li&gt;:slightly_frowning_face:&lt;/li&gt;
&lt;li&gt;:slightly_frowning_face:&lt;/li&gt;
&lt;li&gt;Continue on technical documentation project.&lt;/li&gt;
&lt;li&gt;Continue on technical documentation project.&lt;/li&gt;
&lt;li&gt;Continue hypnosis for coaching.&lt;/li&gt;
&lt;li&gt;:slightly_frowning_face:&lt;/li&gt;
&lt;li&gt;:slightly_frowning_face:&lt;/li&gt;
&lt;li&gt;Start &lt;a href="https://jneidel.com/review/20-days-in-mariupol/"&gt;20 Days in Mariupol review&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Start on 720 Degree bottle review.&lt;/li&gt;
&lt;li&gt;Start &lt;a href="https://jneidel.com/newsletter/no-audio-visual-media/"&gt;newsletter #4&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Start on article about what NLP is.&lt;/li&gt;
&lt;li&gt;Continue on article about what NLP is. Add to NLP Practioner review. Finish &lt;a href="https://jneidel.com/review/20-days-in-mariupol/"&gt;20 Days in Mariupol review&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Write page about &lt;a href="https://jneidel.com/ai/"&gt;AI usage&lt;/a&gt;. Finish and translate &lt;a href="https://jneidel.com/newsletter/no-audio-visual-media/"&gt;newsletter #4&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Continue on what is NLP.&lt;/li&gt;
&lt;li&gt;:slightly_frowning_face:&lt;/li&gt;
&lt;li&gt;:slightly_frowning_face:&lt;/li&gt;
&lt;li&gt;Continue on technical documentation project.&lt;/li&gt;
&lt;li&gt;:slightly_frowning_face:&lt;/li&gt;
&lt;li&gt;Start essay about barefoot shoes.&lt;/li&gt;
&lt;li&gt;Write essay about &amp;ldquo;&lt;a href="https://jneidel.com/essay/no-time/"&gt;I don&amp;rsquo;t have time&lt;/a&gt;&amp;rdquo;.&lt;/li&gt;
&lt;li&gt;:slightly_frowning_face:&lt;/li&gt;
&lt;li&gt;Start &lt;a href="https://jneidel.com/newsletter/no-media-conclusions/"&gt;newsletter #5&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Continue &lt;a href="https://jneidel.com/newsletter/no-media-conclusions/"&gt;newsletter #5&lt;/a&gt;. Publish translated &lt;a href="https://jneidel.com/review/neurostreams/"&gt;Neurostreams review&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;:slightly_frowning_face:&lt;/li&gt;
&lt;li&gt;Continue &lt;a href="https://jneidel.com/newsletter/no-media-conclusions/"&gt;newsletter #5&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Publish &lt;a href="https://jneidel.com/newsletter/no-media-conclusions/"&gt;newsletter #5&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;:slightly_frowning_face:&lt;/li&gt;
&lt;li&gt;Start &lt;a href="https://jneidel.com/de/project/b%C3%B6rsenstrategie/"&gt;stock market strategy&lt;/a&gt;&lt;sup&gt;:de:&lt;/sup&gt;.&lt;/li&gt;
&lt;li&gt;Finish &lt;a href="https://jneidel.com/de/project/b%C3%B6rsenstrategie/"&gt;stock market strategy&lt;/a&gt;&lt;sup&gt;:de:&lt;/sup&gt;.&lt;/li&gt;
&lt;li&gt;Update Minimeal and John Rohn review. Publish &lt;a href="https://jneidel.com/newsletter/4x4-visualizations/"&gt;newsletter #6&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;:slightly_frowning_face:&lt;/li&gt;
&lt;li&gt;Update &lt;a href="https://jneidel.com/project/challenges/"&gt;challenges&lt;/a&gt;. Update &lt;a href="https://jneidel.com/de/review/nlp23"&gt;NLP23 Review&lt;/a&gt;&lt;sup&gt;
 &lt;abbr class="no-underline" title="The linked article is in German."&gt;:de:&lt;/abbr&gt;
&lt;/sup&gt;
.&lt;/li&gt;
&lt;li&gt;:slightly_frowning_face:&lt;/li&gt;
&lt;li&gt;Finish &lt;a href="https://jneidel.com/misc/what-is-nlp/"&gt;What is NLP&lt;/a&gt;?&lt;/li&gt;
&lt;li&gt;Work on GbR project.&lt;/li&gt;
&lt;li&gt;Start &lt;a href="https://jneidel.com/newsletter/becoming-an-idea-machine/"&gt;newsletter #7&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Write &lt;a href="https://jneidel.com/newsletter/becoming-an-idea-machine/"&gt;newsletter #7&lt;/a&gt;. Write &lt;a href="https://jneidel.com/project/naming-the-newsletter/"&gt;Naming the newsletter&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Publish &lt;a href="https://jneidel.com/newsletter/becoming-an-idea-machine/"&gt;newsletter #7&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;:neutral_face:&lt;/li&gt;
&lt;li&gt;:neutral_face:&lt;/li&gt;
&lt;li&gt;:neutral_face:&lt;/li&gt;
&lt;li&gt;:neutral_face:&lt;/li&gt;
&lt;li&gt;:neutral_face:&lt;/li&gt;
&lt;li&gt;:neutral_face:&lt;/li&gt;
&lt;li&gt;Update changing internet providers project.&lt;/li&gt;
&lt;li&gt;:neutral_face:&lt;/li&gt;
&lt;li&gt;:neutral_face:&lt;/li&gt;
&lt;li&gt;Start time-tracking guide.&lt;/li&gt;
&lt;li&gt;:neutral_face:&lt;/li&gt;
&lt;li&gt;:neutral_face:&lt;/li&gt;
&lt;li&gt;:face_with_thermometer:&lt;/li&gt;
&lt;li&gt;:face_with_thermometer:&lt;/li&gt;
&lt;li&gt;:face_with_thermometer:&lt;/li&gt;
&lt;li&gt;:neutral_face:&lt;/li&gt;
&lt;li&gt;Start rewrite and restructure of &lt;a href="https://jneidel.com/now/"&gt;now&lt;/a&gt; and about pages.&lt;/li&gt;
&lt;li&gt;Write and publish digitizing papers project.&lt;/li&gt;
&lt;li&gt;Continue &lt;a href="https://jneidel.com/now/"&gt;now&lt;/a&gt; rewrite.&lt;/li&gt;
&lt;li&gt;Continue time-tracking guide.&lt;/li&gt;
&lt;li&gt;:neutral_face:&lt;/li&gt;
&lt;li&gt;Write and publish &lt;a href="https://jneidel.com/newsletter/focus-on-the-present/"&gt;newsletter #8&lt;/a&gt;. Publish updated &lt;a href="https://jneidel.com/now/"&gt;now&lt;/a&gt;. Start year recap.&lt;/li&gt;
&lt;li&gt;Continue year recap.&lt;/li&gt;
&lt;li&gt;:neutral_face:&lt;/li&gt;
&lt;li&gt;:neutral_face:&lt;/li&gt;
&lt;li&gt;:neutral_face:&lt;/li&gt;
&lt;li&gt;:neutral_face:&lt;/li&gt;
&lt;li&gt;Start &lt;a href="https://jneidel.com/newsletter/into-data-hierarchies/"&gt;newsletter #9&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Continue &lt;a href="https://jneidel.com/newsletter/into-data-hierarchies/"&gt;newsletter #9&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Publish &lt;a href="https://jneidel.com/newsletter/into-data-hierarchies/"&gt;newsletter #9&lt;/a&gt;. Rewrite &lt;a href="https://jneidel.com/dev/transmission-behind-wireguard/"&gt;torrenting setup guide&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;:neutral_face:&lt;/li&gt;
&lt;li&gt;:neutral_face:&lt;/li&gt;
&lt;li&gt;Edit &lt;a href="https://jneidel.com/project/naming-the-newsletter/"&gt;naming the newsletter&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;:neutral_face:&lt;/li&gt;
&lt;li&gt;:neutral_face:&lt;/li&gt;
&lt;li&gt;:neutral_face:&lt;/li&gt;
&lt;li&gt;:neutral_face:&lt;/li&gt;
&lt;li&gt;:neutral_face:&lt;/li&gt;
&lt;li&gt;Write intro to &lt;a href="https://jneidel.com/newsletter/focus-challenge-react-create/"&gt;newsletter #10&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Update &lt;a href="https://jneidel.com/now/"&gt;now&lt;/a&gt; projects.&lt;/li&gt;
&lt;li&gt;:neutral_face:&lt;/li&gt;
&lt;li&gt;Write conclusions to this challenge.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="learnings" class="relative group"&gt;Learnings &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#learnings" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;h3 id="progress" class="relative group"&gt;Progress &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#progress" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h3&gt;&lt;p&gt;I can feel that I&amp;rsquo;m getting better at writing.&lt;/p&gt;
&lt;p&gt;Structuring posts has become easier.
First drafts are better.
Editing is faster.
I have a better sense of what won&amp;rsquo;t and will fit.
The distinction between English/German has become more clear.
I don&amp;rsquo;t mix the two together as much and both sound more natural.
It&amp;rsquo;s easier to write clear short sentences.
To omit unneeded words.
I pick up and improve little stylistic elements, like: quoting a source, the
us of footnotes, parenthesis for explanations, headline interaction with the
text before and after, etc.&lt;/p&gt;
&lt;p&gt;This outcome was expected, but it is still satisfying to see this happen
organically, just by sitting down to do the work.&lt;/p&gt;
&lt;h3 id="comprehension--completion" class="relative group"&gt;Comprehension &amp;amp; Completion &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#comprehension--completion" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h3&gt;&lt;p&gt;The ideas and projects I pick to write about are usually very thought-out.
I have already engaged with them, internalized and applied them to my life.&lt;/p&gt;
&lt;p&gt;What I find in writing about them is that they were not as clear in my mind
as I had thought.
There are aspects I overlooked.
Discrepancies that reveal themselves.
Questions I can&amp;rsquo;t answer, that pop into my head.&lt;/p&gt;
&lt;p&gt;Writing forces me to clearly structure everything I know on the topic in my
mind.&lt;/p&gt;
&lt;p&gt;It also makes me really complete a project.
I go through my messy notes and create a beautifully shaped article out of
them.
One that put the core ideas are front and center.
That lacks the unimportant references and tangents (side notes.)
That is clearly structured and referenceable.&lt;/p&gt;
&lt;h3 id="when-i-otherwise-wouldnt" class="relative group"&gt;When I otherwise wouldn&amp;rsquo;t &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#when-i-otherwise-wouldnt" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h3&gt;&lt;p&gt;There were many days that I sat down to write in the evening just because I
had to.
This challenge forced me to do the right thing, when I otherwise wouldn&amp;rsquo;t.&lt;/p&gt;
&lt;p&gt;Sometimes I would write very little.
That&amp;rsquo;s ok.
I made the bar (required minimum) very low on purpose.
I still did the writing and kept up the habit.&lt;/p&gt;
&lt;p&gt;Sometimes I was not in the mood.
I still sat down to write and discovered that it was a lot of fun.
It always is.&lt;/p&gt;
&lt;h2 id="challenge-conclusion" class="relative group"&gt;Challenge conclusion &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#challenge-conclusion" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;The &lt;a href="https://jneidel.com/project/writing-365/#daily-log"&gt;last two months&lt;/a&gt; of this challenge were on and off.
I was not really committed to the challenge any more.
The big reason for this was:
In my mind I had already already the goal behind this challenge.
Only the arbitrary time restriction kept it alive.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;My writing has improved.&lt;/strong&gt;
Anytime I want to write about a topic, I can pop out an article up to my
quality standard.
All the processes are in place, I know how to arrange the filter the
contents and describe the topic in a compelling way.
Certainly, there is still much room for improvement, especially when it
comes to moving a reader to action.
It is a topic I will focus on again in the future.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The website has a decent amount of content.&lt;/strong&gt;
When I started this website, I only had ideas of how things would work.
I didn&amp;rsquo;t have the articles to fill my categories.
I didn&amp;rsquo;t know if it would make sense.
Now I do.
To me, the concept has been validated and realized.
A website can always have more articles and I have more to say.
And I will. With time.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Future grow of the website does not hinge on more content.&lt;/strong&gt;
Articles are a factor, but SEO alone will not do it for me.
Instead I would have to market the website and spend time on growing an
audience.
That, combined with a focus on putting out more articles is most likely a
future priority.&lt;/p&gt;
&lt;p&gt;With these point in mind, my focus naturally shifted.
Other topic come into focus and supplanted writing.
It became an annoyance on my todo list.
I still like writing and this was fun, but I now have &lt;a href="https://jneidel.com/now/"&gt;other things&lt;/a&gt; I
am focused on.
These challenges needs to be in line with my priorities, not the other way
around.&lt;/p&gt;
&lt;p&gt;Future writing for this website:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;I will continue to publish the &lt;a href="https://jneidel.com/newsletter/"&gt;newsletter&lt;/a&gt; every week.&lt;/li&gt;
&lt;li&gt;I will try to publish one article every other week.&lt;/li&gt;
&lt;li&gt;The articles will be about topics I am currently working through.&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>What is the use of an Air Purifier? Benefits explained.</title><link>https://jneidel.com/review/air-purifier/</link><pubDate>Sat, 18 May 2024 00:00:00 +0000</pubDate><author>web@jneidel.com (Jonathan Neidel)</author><guid>https://jneidel.com/review/air-purifier/</guid><description>&lt;p&gt;A review of the Levoit Core 300S.&lt;/p&gt;
&lt;h2 id="whats-an-air-purifier" class="relative group"&gt;What&amp;rsquo;s an air purifier? &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#whats-an-air-purifier" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;div class="flex flex-row justify-center items-start gap-2 [&amp;&gt;*]:min-w-0
 sm:float-right"&gt;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 &lt;figure class="ml-2 h-52 w-auto mx-auto my-0 rounded-sm"&gt;
 
 
 
 
 
 
 
 
 
 
 
 
 
 &lt;picture
 class="ml-2 h-52 w-auto mx-auto my-0 rounded-sm"
 
 &gt;
 
 
 
 
 
 &lt;source
 
 srcset="https://jneidel.com/review/air-purifier/cover-air-purifier_hu_44fa13da821515ec.webp 330w,/review/air-purifier/cover-air-purifier_hu_7f90afffa15d93ed.webp 660w
 
 ,/review/air-purifier/cover-air-purifier_hu_bdc6e547328a2ba9.webp 1024w
 
 
 
 ,/review/air-purifier/cover-air-purifier_hu_19dd7b2d0563a572.webp 1152w
 
 "
 
 sizes="100vw"
 type="image/webp"
 /&gt;
 
 &lt;img
 width="1152"
 height="1224"
 class="ml-2 h-52 w-auto mx-auto my-0 rounded-sm"
 alt="Air Purifier with a bottle for scale"
 loading="lazy" decoding="async"
 
 
 src="https://jneidel.com/review/air-purifier/cover-air-purifier_hu_fb9bd4dcb73aaf66.jpg"
 srcset="https://jneidel.com/review/air-purifier/cover-air-purifier_hu_2e7ee196ce3eb34.jpg 330w,/review/air-purifier/cover-air-purifier_hu_fb9bd4dcb73aaf66.jpg 660w
 
 ,/review/air-purifier/cover-air-purifier_hu_418c7b7c431da2e0.jpg 1024w
 
 
 ,/review/air-purifier/cover-air-purifier.jpg 1152w
 "
 sizes="100vw"
 
 /&gt;
 &lt;/picture&gt;
 
 
 
 
 &lt;/figure&gt;
 


&lt;/div&gt;

&lt;p&gt;A white cylinder that captiously draws in air through a filter system.
The filters trap particles like dust, mould spores, pollen and smoke.
Resulting in cleaner air.&lt;/p&gt;
&lt;h2 id="how-do-we-use-it" class="relative group"&gt;How do we use it? &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#how-do-we-use-it" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;It sits in the middle of the apartment.
That is, between the kitchen and the rest of the place.
We have the machine running in automatic mode, which means that when the air is
clean, the machine is quiet and just sits there.
But when my wife starts cooking without oil again and creates a bunch of smoke
in the kitchen, then the air purifier will kick into overdrive and start
whirling loudly, doing it&amp;rsquo;s best to get that burnt smell out of the air &lt;abbr title="As soon as possible"&gt;ASAP&lt;/abbr&gt;.&lt;/p&gt;
&lt;p&gt;And that is really our main use of the thing.
To get unpleasant smells out of the air (mostly from cooking, but also smells
coming in from the hallway.)
Previously we had used incense to cover up the smells or opened two windows to
get the air flowing.
That worked OK, but the purifier does it faster, better and automatically.&lt;/p&gt;
&lt;h2 id="costs" class="relative group"&gt;Costs &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#costs" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;This particular machine does a fine job at cleaning the air in a 75m&lt;sup&gt;2&lt;/sup&gt; place.
Don&amp;rsquo;t let them upsell you into a bigger machine.&lt;/p&gt;
&lt;p&gt;The costs come out to three factors:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Initial cost of the machine: 125€ new, but we got it used for 30€.
I would not have paid full price for a new one.&lt;/li&gt;
&lt;li&gt;Regular costs of &lt;a href="https://amzn.to/3BgL5N4" rel="external"&gt;replacing the filter&lt;/a&gt;: 17€ every 6-8 months.&lt;/li&gt;
&lt;li&gt;Regular energy costs: Not measured&lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="maintenance" class="relative group"&gt;Maintenance &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#maintenance" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;With time dust will collect around the air intake holes and on the filter.
Just vacuum the outer shell and the filter.
Don&amp;rsquo;t vacuum the sensor though.
No dust will collect on it and vacuuming it created this weird sound for
me&lt;sup id="fnref:2"&gt;&lt;a href="#fn:2" class="footnote-ref" role="doc-noteref"&gt;2&lt;/a&gt;&lt;/sup&gt;.&lt;/p&gt;
&lt;h2 id="conclusion" class="relative group"&gt;Conclusion &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#conclusion" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;Do you &lt;em&gt;need&lt;/em&gt; one: No.
But some people would benefit from having an air purifier.
E.g. if you have a sensitive nose or cook a lot.&lt;/p&gt;
&lt;p&gt;I don&amp;rsquo;t care about the marginal health benefits.
For me the utility lies in removing unwanted smells from the air.
That, to me, along with the convenient experience makes the machine worth it.&lt;/p&gt;
&lt;div class="footnotes" role="doc-endnotes"&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id="fn:1"&gt;
&lt;p&gt;The machine draws 15W at peak operation. What that averages out to and
if there is a draw on standby would have to be measured.&amp;#160;&lt;a href="#fnref:1" class="footnote-backref" role="doc-backlink"&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:2"&gt;
&lt;p&gt;I could fix that by blowing into the sensor hard.&amp;#160;&lt;a href="#fnref:2" class="footnote-backref" role="doc-backlink"&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</description></item><item><title>Weekly Challenges: A format for continuous growth</title><link>https://jneidel.com/project/challenges/</link><pubDate>Sun, 12 May 2024 00:00:00 +0000</pubDate><author>web@jneidel.com (Jonathan Neidel)</author><guid>https://jneidel.com/project/challenges/</guid><description>&lt;div class="lead !mb-9 text-xl"&gt;
 A way to continuously apply self-development learnings and expand my comfort zone.
&lt;/div&gt;

&lt;p&gt;Any self-development learning can only be as good as your application of it.
If you don&amp;rsquo;t apply it to your life, that idea means nothing.&lt;/p&gt;
&lt;p&gt;Every week I am taking a self-development learning or something I want to
expore and formulate it into an actionable challenge:
A task for me to do every day,
an idea that I want to pay close attention to, as I go through my daily
life, or
a restriction on a certain behavior.&lt;/p&gt;
&lt;!-- TODO: expand --&gt;
&lt;p&gt;I invite you to do something similar.&lt;/p&gt;
&lt;h2 id="my-challenges" class="relative group"&gt;My challenges &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#my-challenges" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;These are the learnings I have focused on.
In the middle of 2024 I converted the format into a
&lt;a href="https://jneidel.com/newsletter/"&gt;newsletter&lt;/a&gt;, where the challenges are clearly defined and I
give some more insight into my experiences and outcomes.&lt;/p&gt;
&lt;span class="flex"&gt;
 &lt;span
 class="ms-1 rounded-md border border-primary-400 px-1 py-[1px] text-xs font-normal text-primary-700 dark:border-primary-600 dark:text-primary-400"
 &gt;
 
Current streak: 5 weeks completed

 &lt;/span&gt;
&lt;/span&gt;


&lt;ul&gt;
&lt;li&gt;&lt;input checked="" disabled="" type="checkbox"&gt; Week 19: Applied:
&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://jneidel.com/essay/power-plant/"&gt;The power plant doesn&amp;rsquo;t have power, it generates power&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;&lt;input checked="" disabled="" type="checkbox"&gt; Week 20-21: Applied &lt;a href="https://jneidel.com/essay/eat-that-frog/"&gt;Eat that frog&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;input checked="" disabled="" type="checkbox"&gt; Week 22: &lt;a href="https://jneidel.com/review/neurostreams/"&gt;Neurostreams&lt;/a&gt; intensive&lt;/li&gt;
&lt;li&gt;&lt;input checked="" disabled="" type="checkbox"&gt; Week 23: Applied:
&lt;blockquote&gt;
&lt;p&gt;People are like balloons, with each interaction you can either
let some air out of them, or blow them up a little.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;&lt;input checked="" disabled="" type="checkbox"&gt; Week 24: &lt;a href="https://jneidel.com/essay/no-interrupting/"&gt;No interrupting others&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;input checked="" disabled="" type="checkbox"&gt; Week 25: No new information. Don&amp;rsquo;t consume anything I haven&amp;rsquo;t read or
listed to before.&lt;/li&gt;
&lt;li&gt;&lt;input checked="" disabled="" type="checkbox"&gt; Week 26: Listen to my purpose. Consider the things that I am doing.
Are they aligned with my compass (purpose) or are they not? What can I do
about the ones that are not? How can I strengthen the ones that are?&lt;/li&gt;
&lt;li&gt;&lt;input checked="" disabled="" type="checkbox"&gt; Week 27: Leave work unfinished. Leave a task you want to continue
later/tomorrow unfinished, so that you don&amp;rsquo;t let it go and are drawn to it
later.&lt;/li&gt;
&lt;li&gt;&lt;input checked="" disabled="" type="checkbox"&gt; Week 28: Watch for signs of VAKOG. What are the conversation partners
preferred communication channels? Listen for signals. Preparation for an
upcoming &lt;a href="https://jneidel.com/de/review/nlp23"&gt;NLP seminar&lt;/a&gt;&lt;sup&gt;
 &lt;abbr class="no-underline" title="The linked article is in German."&gt;:de:&lt;/abbr&gt;
&lt;/sup&gt;
.&lt;/li&gt;
&lt;li&gt;&lt;input checked="" disabled="" type="checkbox"&gt; Week 29: Dedicate some more attention to applying the Hemingway trick. See: &lt;a href="https://jneidel.com/newsletter/hemingway-trick/#last-challenge"&gt;outcome&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;input checked="" disabled="" type="checkbox"&gt; Week 30: Learn and apply the Milton model to my self-talk.
On the weekend make an effort to remember peoples names at the NLP seminar I&amp;rsquo;m attending. See: &lt;a href="https://jneidel.com/newsletter/hemingway-trick/#next-challenge"&gt;definition&lt;/a&gt; &amp;amp; &lt;a href="https://jneidel.com/newsletter/presence-in-daily-life/#review-of-last-challenge"&gt;outcome&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;input checked="" disabled="" type="checkbox"&gt; Week 34: Improve presence in daily life.
&lt;br&gt;&lt;span class="pr-24 mr-[2px]"&gt;&lt;/span&gt;See: &lt;a href="https://jneidel.com/newsletter/presence-in-daily-life/#next-challenge"&gt;definition&lt;/a&gt; &amp;amp; &lt;a href="https://jneidel.com/newsletter/effects-of-formal-clothing/#review-of-last-challenge"&gt;outcome&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;input checked="" disabled="" type="checkbox"&gt; Week 35: Wear formal clothing to promote abstract thinking.
&lt;br&gt;&lt;span class="pr-24 mr-[2px]"&gt;&lt;/span&gt;See: &lt;a href="https://jneidel.com/newsletter/effects-of-formal-clothing/#next-challenge"&gt;definition&lt;/a&gt; &amp;amp; &lt;a href="https://jneidel.com/newsletter/no-audio-visual-media/#review-of-the-last-challenge"&gt;outcome&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;input checked="" disabled="" type="checkbox"&gt; Week 36-37: No audio-visual media.
&lt;br&gt;&lt;span class="pr-28 mr-[14px]"&gt;&lt;/span&gt;See: &lt;a href="https://jneidel.com/newsletter/no-audio-visual-media/#next-challenge"&gt;definition&lt;/a&gt; &amp;amp; &lt;a href="https://jneidel.com/newsletter/no-media-conclusions/#review-of-the-last-challenge"&gt;outcome&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;input checked="" disabled="" type="checkbox"&gt; Week 38: Sun salutations as the first thing after getting out of bed.
&lt;br&gt;&lt;span class="pr-24 mr-[2px]"&gt;&lt;/span&gt;See: &lt;a href="https://jneidel.com/newsletter/no-media-conclusions/#next-challenge"&gt;definition&lt;/a&gt; &amp;amp; &lt;a href="https://jneidel.com/newsletter/4x4-visualizations/#review-of-the-last-challenge"&gt;outcome&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; Week 39: 4x4 + Visualizations. Write down 4x4 goals (4 biggest
goals, 4 times each) followed by a visualization technique that sounds
actually effective. See: &lt;a href="https://jneidel.com/newsletter/4x4-visualizations/#next-challenge"&gt;definition&lt;/a&gt; &lt;!-- &amp; [outcome](newsletter/7#review-of-the-last-challenge) --&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;!-- - [ ] **Week &lt;++&gt;**: &lt;++&gt;. See: [definition](newsletter/7#next-challenge) &amp; [outcome](newsletter/8#review-of-the-last-challenge) --&gt;
&lt;!-- - [ ] Week 36: Measure my awareness. Ask myself every 30m "How present are --&gt;
&lt;!-- you on a scale of 1-10?" --&gt;
&lt;!-- - [ ] Week 37: Pose a question to my unconscious in the evening, something --&gt;
&lt;!-- that I want solved for my brain to work on overnight. --&gt;
&lt;p&gt;If you have a suggestion for something I should try,
just &lt;a href="mailto:challenge-suggestion@jneidel.com" rel="external"&gt;let me know&lt;/a&gt; :slightly_smiling_face:&lt;/p&gt;
&lt;!-- TODO: rework --&gt;
&lt;!-- ## What is this? --&gt;
&lt;!----&gt;
&lt;!-- My goal is to write an article about the experience of each challenge. --&gt;
&lt;!-- So for past challenges you will find those articles linked. --&gt;
&lt;!-- Each challenge also comes with a short description of what it's about/what my --&gt;
&lt;!-- intention for it was. --&gt;
&lt;h2 id="benefits-of-keeping-a-page-like-this" class="relative group"&gt;Benefits of keeping a page like this &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#benefits-of-keeping-a-page-like-this" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;Defining challenges ahead of time stops this behavior in it&amp;rsquo;s track:
&amp;ldquo;Oh, I don&amp;rsquo;t know what challenge to do next&amp;rdquo;, which leads to &amp;ldquo;Damn I forgot to
define a challenge&amp;rdquo; :right_arrow: &amp;ldquo;I guess I&amp;rsquo;ll skip this week&amp;rdquo; :right_arrow:
&lt;em&gt;*ignores next reminder*&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;It also works as a way to keep me accountable to stick with these challenges.
I combine it with an accountability group that I keep up with every week.&lt;/p&gt;
&lt;p&gt;This page will be updated continuously and it will grow with time.
Feel free to bookmark the site and come back to it on a later date
:slightly_smiling_face:.&lt;/p&gt;</description></item><item><title>Easily collect website feedback</title><link>https://jneidel.com/guide/collect-website-feedback/</link><pubDate>Sat, 11 May 2024 00:00:00 +0000</pubDate><author>web@jneidel.com (Jonathan Neidel)</author><guid>https://jneidel.com/guide/collect-website-feedback/</guid><description>&lt;p&gt;I have this website.
It will necessarily include errors.
I would like to make it as easy as possible for other people to help me fix them.
If somebody spots an error, there&lt;/p&gt;
&lt;p&gt;I would categorize people that want to help into the categories of:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Known vs unknown&lt;/strong&gt;: if the person knows the author directly&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Technical vs non-technical&lt;/strong&gt;: if the person is capable of editing the source and submitting a patch&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;If you don&amp;rsquo;t provide people who are willing to help with another option,
they will communicate change requests through these communication channels:&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;&lt;/th&gt;
 &lt;th style="text-align: center"&gt;Unknown&lt;/th&gt;
 &lt;th style="text-align: center"&gt;Known&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Non-technical&lt;/strong&gt;&lt;/td&gt;
 &lt;td style="text-align: center"&gt;Email&lt;/td&gt;
 &lt;td style="text-align: center"&gt;Email or private messenge&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Technical&lt;/strong&gt;&lt;/td&gt;
 &lt;td style="text-align: center"&gt;Email&lt;/td&gt;
 &lt;td style="text-align: center"&gt;Email or private messenge&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;When I see a typo while browsing, I will navigate to the contact page and
write the website owner an email (or use a contact form, if applicable.)&lt;/p&gt;
&lt;h2 id="the-issue-with-email" class="relative group"&gt;The issue with email &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#the-issue-with-email" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;It&amp;rsquo;s better than nothing, but a few problems will crop up:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;People have to leave the website to write an email or take notes.&lt;/li&gt;
&lt;li&gt;Corrections will be inconsistent or have information missing.&lt;/li&gt;
&lt;li&gt;Visual defects are hard to describe through just text.&lt;/li&gt;
&lt;li&gt;It&amp;rsquo;s a missed opportunity. Technical people might be willing to do the correction for you.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;We can do better than that.&lt;/p&gt;
&lt;h2 id="overview-of-solutions" class="relative group"&gt;Overview of solutions &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#overview-of-solutions" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;Let&amp;rsquo;s go through our options for each type of person:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Unknown, non-technical&lt;/strong&gt; person: They are the people least likely to be
interested in helping and it is the hardest to set something up for them.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Known, non-technical&lt;/strong&gt; person: Much more willing to help and we can
provide them credentials to a tool.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Technical&lt;/strong&gt; person: The most interested in helping and most capable at
doing so. Give them an easy way to submit patches.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;By putting this in a table, we get:&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;&lt;/th&gt;
 &lt;th style="text-align: center"&gt;Unknown&lt;/th&gt;
 &lt;th style="text-align: center"&gt;Known&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Non-technical&lt;/strong&gt;&lt;/td&gt;
 &lt;td style="text-align: center"&gt;Email&lt;/td&gt;
 &lt;td style="text-align: center"&gt;Tool&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Technical&lt;/strong&gt;&lt;/td&gt;
 &lt;td style="text-align: center"&gt;Submit a patch&lt;/td&gt;
 &lt;td style="text-align: center"&gt;Submit a patch&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;The concrete solutions I have implemented are detailed below.
How hard or easy they are for you to adopt, depends entirely on your setup.
There might be comparable variants in whatever you are using.
Even if you can not make use of them directly, the principles will be the
same.&lt;/p&gt;
&lt;p&gt;These are the solutions that I am using and will detail below:&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;&lt;/th&gt;
 &lt;th style="text-align: center"&gt;Unknown&lt;/th&gt;
 &lt;th style="text-align: center"&gt;Known&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Non-technical&lt;/strong&gt;&lt;/td&gt;
 &lt;td style="text-align: center"&gt;Email&lt;/td&gt;
 &lt;td style="text-align: center"&gt;&lt;a href="https://jneidel.com/guide/collect-website-feedback/#netlify-drawer"&gt;Netlify Drawer&lt;/a&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Technical&lt;/strong&gt;&lt;/td&gt;
 &lt;td style="text-align: center"&gt;&lt;a href="https://jneidel.com/guide/collect-website-feedback/#edit-on-github"&gt;Edit on Github button&lt;/a&gt;&lt;/td&gt;
 &lt;td style="text-align: center"&gt;&lt;a href="https://jneidel.com/guide/collect-website-feedback/#edit-on-github"&gt;Edit on Github button&lt;/a&gt; or &lt;a href="https://jneidel.com/guide/collect-website-feedback/#netlify-drawer"&gt;Netlify Drawer&lt;/a&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="netlify-drawer" class="relative group"&gt;Netlify Drawer &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#netlify-drawer" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;&lt;a href="https://netlify.com" rel="external"&gt;Netlify&lt;/a&gt; has embedded a tool for submitting feedback directly without leaving the page.&lt;/p&gt;
&lt;p&gt;The obvious requirement: Your site has to be hosted on Netlify.&lt;/p&gt;
&lt;h3 id="how-does-it-work" class="relative group"&gt;How does it work? &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#how-does-it-work" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h3&gt;&lt;p&gt;At the bottom of the page there is a UI element.&lt;/p&gt;

 
 
 
 
 
 
 

 
 
 

 
 

 
 
 &lt;figure class=" mx-auto my-0 rounded-sm"&gt;
 
 
 









 
 &lt;picture
 class=" mx-auto my-0 rounded-sm"
 
 &gt;
 
 
 

 
 &lt;source
 
 srcset="https://jneidel.com/guide/collect-website-feedback/netlify-drawer-bottom_hu_3e94d73e65c2c770.webp 330w,/guide/collect-website-feedback/netlify-drawer-bottom_hu_ef643f506971c150.webp 660w
 
 ,/guide/collect-website-feedback/netlify-drawer-bottom_hu_47e5b8ec6dc0843a.webp 1024w
 
 
 ,/guide/collect-website-feedback/netlify-drawer-bottom_hu_6c49c34e24e0a64f.webp 1320w
 "
 
 sizes="100vw"
 type="image/webp"
 /&gt;
 
 &lt;img
 width="1336"
 height="221"
 class=" mx-auto my-0 rounded-sm"
 alt="Netlify drawer at the bottom of the page"
 loading="lazy" decoding="async"
 
 
 src="https://jneidel.com/guide/collect-website-feedback/netlify-drawer-bottom_hu_27249019afca5686.png"
 srcset="https://jneidel.com/guide/collect-website-feedback/netlify-drawer-bottom_hu_378c4a29b50a1071.png 330w,/guide/collect-website-feedback/netlify-drawer-bottom_hu_27249019afca5686.png 660w
 
 ,/guide/collect-website-feedback/netlify-drawer-bottom_hu_be29bd42c5ec40e9.png 1024w
 
 
 ,/guide/collect-website-feedback/netlify-drawer-bottom_hu_2c0eac06f5d12904.png 1320w
 "
 sizes="100vw"
 
 /&gt;
 &lt;/picture&gt;
 


 &lt;figcaption class="text-center"&gt;The drawer on the bottom of a page.&lt;/figcaption&gt;
 &lt;/figure&gt;


&lt;p&gt;Clicking it will expand it, to reveal a form.
Through this form you can submit text, take screenshots or record
video&lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt;.
What ever fits best to document the defect, submit a correction or suggest
something.&lt;/p&gt;

 
 
 
 
 
 
 

 
 
 

 
 

 
 
 &lt;figure class=" mx-auto my-0 rounded-sm"&gt;
 
 
 









 
 &lt;picture
 class=" mx-auto my-0 rounded-sm"
 
 &gt;
 
 
 

 
 &lt;source
 
 srcset="https://jneidel.com/guide/collect-website-feedback/netlify-drawer-example_hu_81d727886321d908.webp 330w,/guide/collect-website-feedback/netlify-drawer-example_hu_5520369da1d2c450.webp 660w
 
 ,/guide/collect-website-feedback/netlify-drawer-example_hu_f46a48db4f3d14d6.webp 1024w
 
 
 ,/guide/collect-website-feedback/netlify-drawer-example_hu_cb7bc3e6d4cbd59d.webp 1320w
 "
 
 sizes="100vw"
 type="image/webp"
 /&gt;
 
 &lt;img
 width="1440"
 height="945"
 class=" mx-auto my-0 rounded-sm"
 alt="Example of the expanded Netlify drawer"
 loading="lazy" decoding="async"
 
 
 src="https://jneidel.com/guide/collect-website-feedback/netlify-drawer-example_hu_e5f49ff882e2b279.png"
 srcset="https://jneidel.com/guide/collect-website-feedback/netlify-drawer-example_hu_a5f0303b287484f2.png 330w,/guide/collect-website-feedback/netlify-drawer-example_hu_e5f49ff882e2b279.png 660w
 
 ,/guide/collect-website-feedback/netlify-drawer-example_hu_522807a1ff229726.png 1024w
 
 
 ,/guide/collect-website-feedback/netlify-drawer-example_hu_efc0079eb9915fe.png 1320w
 "
 sizes="100vw"
 
 /&gt;
 &lt;/picture&gt;
 


 &lt;figcaption class="text-center"&gt;Submit a correction through the expanded drawer.&lt;/figcaption&gt;
 &lt;/figure&gt;


&lt;p&gt;Make sure to assign an epic, so the owner will be notified:&lt;/p&gt;

 
 
 
 
 
 
 

 
 
 

 
 

 
 
 &lt;figure class="w-8/12 mx-auto my-0 rounded-sm"&gt;
 
 
 









 
 &lt;picture
 class="w-8/12 mx-auto my-0 rounded-sm"
 
 &gt;
 
 
 

 
 &lt;source
 
 
 srcset="https://jneidel.com/guide/collect-website-feedback/netlify-drawer-assign-epic_hu_3480920447ec3798.webp"
 
 
 sizes="100vw"
 type="image/webp"
 /&gt;
 
 &lt;img
 width="307"
 height="280"
 class="w-8/12 mx-auto my-0 rounded-sm"
 alt="Netlify Drawer epic dropdown"
 loading="lazy" decoding="async"
 
 
 src="https://jneidel.com/guide/collect-website-feedback/netlify-drawer-assign-epic.png"
 
 /&gt;
 &lt;/picture&gt;
 


 
 &lt;/figure&gt;


&lt;p&gt;That&amp;rsquo;s it from the user perspective.
They just send of their report and close the drawer.
As the site operator, I get an email with all the info I need to fix the
reported issue:&lt;/p&gt;

 
 
 
 
 
 
 

 
 
 

 
 

 
 
 
 
 
 &lt;figure class="w-8/12 mx-auto my-0 rounded-sm"&gt;
 &lt;img src="./email-notification-shortcut.jpg" alt="Email from Shortcut notifying me of an issue" class="w-8/12 mx-auto my-0 rounded-sm"/&gt;
 
 &lt;/figure&gt;


&lt;h3 id="setup" class="relative group"&gt;Setup &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#setup" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h3&gt;&lt;p&gt;This is how you can configure your own site to use the Netlify Drawer just
like this.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href="https://jneidel.com/guide/collect-website-feedback/#1-setup-a-parallel-deployment-with-the-netlify-drawer-activated"&gt;Setup a parallel deployment with the Netlify Drawer activated&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://jneidel.com/guide/collect-website-feedback/#2-create-a-reviewer-netlify-account"&gt;Create a reviewer Netlify account&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://jneidel.com/guide/collect-website-feedback/#3-create-two-shortcut-accounts"&gt;Create two Shortcut accounts&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://jneidel.com/guide/collect-website-feedback/#4-configure-shortcut-accounts"&gt;Configure Shortcut accounts&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://jneidel.com/guide/collect-website-feedback/#5-configure-netlify-reviewer-account"&gt;Configure Netlify reviewer account&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 id="1-setup-a-parallel-deployment-with-the-netlify-drawer-activated" class="relative group"&gt;1. Setup a parallel deployment with the Netlify Drawer activated &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#1-setup-a-parallel-deployment-with-the-netlify-drawer-activated" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h4&gt;&lt;p&gt;We don&amp;rsquo;t want have the Netlify Drawer active on the main site, since we only
want the reviewers to be able to see it.
We need a parallel deployment, which mirrors production, and has the Netlify
Drawer enabled.&lt;/p&gt;
&lt;p&gt;Do configure that we log into Netlify and:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Create a new site&lt;/li&gt;
&lt;li&gt;Supply the same repo as build source&lt;/li&gt;
&lt;li&gt;(Optional: Change the build command -&amp;gt; I also make drafts visible.)&lt;/li&gt;
&lt;li&gt;Under &amp;ldquo;Branches and deploy contexts&amp;rdquo;:
&lt;ul&gt;
&lt;li&gt;Set the production branch to &amp;ldquo;none&amp;rdquo; or something invalid.&lt;/li&gt;
&lt;li&gt;Add your master branch under &amp;ldquo;Branch deploys&amp;rdquo; (Netlify Drawer only works
on branches deployments, not on the production deployment.)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Scroll down to &amp;ldquo;Collaboration tools&amp;rdquo; and make sure it is enable on branch
deployments.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Now whenever you deploy push to your master branch, you will also get a
secondary deployment with Netlify Drawer enabled.
The working link will be branch + site name.
Like this:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-txt" data-lang="txt"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;https://master--jneidel-stage.netlify.app
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="2-create-a-reviewer-netlify-account" class="relative group"&gt;2. Create a reviewer Netlify account &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#2-create-a-reviewer-netlify-account" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h4&gt;&lt;p&gt;We want to have a reviewer account whose credentials we can just pass along
to all our reviewers.
Let&amp;rsquo;s create a new account for that.
It&amp;rsquo;s easiest if you start by inviting the new account as a reviewer to your
team under &amp;ldquo;Team &amp;gt; Members &amp;gt; Reviewers &amp;gt; Add Reviewer.&amp;rdquo;
Then just sign-up from the email you received.&lt;/p&gt;
&lt;h4 id="3-create-two-shortcut-accounts" class="relative group"&gt;3. Create two Shortcut accounts &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#3-create-two-shortcut-accounts" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h4&gt;&lt;p&gt;Head over to &lt;a href="https://www.shortcut.com" rel="external"&gt;Shortcut&lt;/a&gt;, to first create an
account for yourself.
If you sign-up with an email from &lt;a href="https://kill-the-newsletter.com" rel="external"&gt;Kill the Newsletter&lt;/a&gt;
you can get all communication (i.e. future notifications of changes) through
a RSS feed.&lt;/p&gt;
&lt;p&gt;After your primary account is signed-up, we want to create another account
for our reviewers to use.
From the primary account invite the reviewer email to your shortcut team.
Then go through that accounts sign-up flow as well.&lt;/p&gt;
&lt;h4 id="4-configure-shortcut-accounts" class="relative group"&gt;4. Configure Shortcut accounts &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#4-configure-shortcut-accounts" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h4&gt;&lt;p&gt;While on your primary account, go into &amp;ldquo;Settings &amp;gt; Notifications&amp;rdquo; and
enable &amp;ldquo;Most Events.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;Select the &amp;ldquo;Epics&amp;rdquo; section in the sidebar under &amp;ldquo;Teams &amp;gt; All Work&amp;rdquo; and
create a new epic for your reviewers to create issues in. Assign yourself as
owner, so that you will be notified of any new issues that are created in
that epic.&lt;/p&gt;
&lt;p&gt;While on the secondary reviewer account, go into &amp;ldquo;Settings &amp;gt; API Tokens&amp;rdquo; to
create a new token and save it for the next step.&lt;/p&gt;
&lt;h4 id="5-configure-netlify-reviewer-account" class="relative group"&gt;5. Configure Netlify reviewer account &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#5-configure-netlify-reviewer-account" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h4&gt;&lt;p&gt;Open your secondary Netlify deployment, open the drawer and log in with the
Netlify reviewer account.
Go into integrations and connect to Shortcut by pasting in the API Token for the
Shortcut reviewer account created in the previous step.&lt;/p&gt;
&lt;h4 id="6-profit" class="relative group"&gt;6. Profit &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#6-profit" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h4&gt;&lt;p&gt;Now everything is setup and you can pass the credentials to the Netlify
reviewer account and linkt to the secondary deployment along to your
reviewers.
You will be notified of their reports via email.&lt;/p&gt;
&lt;h2 id="edit-on-github" class="relative group"&gt;Edit on Github &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#edit-on-github" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;If you website sources are hosted publicly, everyone will be able to suggest
improvements.
Otherwise you need to grant access to individual reviewers to be able to
receive their suggestions&lt;/p&gt;
&lt;p&gt;In my case the website&amp;rsquo;s repo is hosted on &lt;a href="https://github.com/jneidel/jneidel.com" rel="external"&gt;Github&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id="how-does-it-work-1" class="relative group"&gt;How does it work? &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#how-does-it-work-1" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h3&gt;&lt;p&gt;I have a button at the top of the page that leads to the markdown source file of
that page.&lt;/p&gt;

 
 
 
 
 
 
 

 
 
 

 
 

 
 
 
 
 
 &lt;figure class="w-10/12 mx-auto my-0 rounded-sm"&gt;
 &lt;img src="./edit-on-github-button.png" alt="A title on my website with the edit on github button highlighted" class="w-10/12 mx-auto my-0 rounded-sm"/&gt;
 
 &lt;/figure&gt;


&lt;p&gt;That buttons leads to &lt;a href="https://github.com/jneidel/jneidel.com/blob/master/content/guide/collect-website-feedback/index.md" rel="external"&gt;this page&lt;/a&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-txt" data-lang="txt"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;https://github.com/jneidel/jneidel.com/blob/master/content/guide/collect-website-feedback/index.md
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;A technical user can edit the page and submit a pull request.
You can try it yourself at the top of this page.&lt;/p&gt;
&lt;h3 id="setup-1" class="relative group"&gt;Setup &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#setup-1" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h3&gt;&lt;p&gt;You need to find a way to generate and embed the link the source file into
the page.
That is something my &lt;a href="https://gohugo.io" rel="external"&gt;hugo&lt;/a&gt; theme (&lt;a href="https://jpanther.github.io/congo/" rel="external"&gt;congo&lt;/a&gt;) does for me.&lt;/p&gt;
&lt;h4 id="setup-with-congo" class="relative group"&gt;Setup with congo &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#setup-with-congo" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h4&gt;&lt;p&gt;I just supply this config:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-toml" data-lang="toml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;params&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;article&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;showEdit&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;editURL&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;https://github.com/jneidel/blog/tree/master/content/&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;editAppendPath&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Within congo, to change the icon to the GitHub logo: copy
&lt;code&gt;layouts/partials/meta/edit.html&lt;/code&gt; in your own project and &lt;code&gt;edit&lt;/code&gt; -&amp;gt;
&lt;code&gt;github&lt;/code&gt;.
To change the hover title, add this to your &lt;code&gt;i18n/en.yaml&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yml" data-lang="yml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;article&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;edit_title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Edit content on GitHub - Thanks for submitting a pull request!&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="conclusions" class="relative group"&gt;Conclusions &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#conclusions" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;If come across problems on this website feel to use the edit button below the
title or let me know via &lt;a href="mailto:corrections@jneidel.com" rel="external"&gt;email&lt;/a&gt; :slightly_smiling_face:&lt;/p&gt;
&lt;div class="footnotes" role="doc-endnotes"&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id="fn:1"&gt;
&lt;p&gt;You can read more about it in &lt;a href="https://docs.netlify.com/site-deploys/collaborate-on-deploys/" rel="external"&gt;Netlify&amp;rsquo;s docs&lt;/a&gt;.&amp;#160;&lt;a href="#fnref:1" class="footnote-backref" role="doc-backlink"&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</description></item><item><title>The Power Plant</title><link>https://jneidel.com/essay/power-plant/</link><pubDate>Sat, 11 May 2024 00:00:00 +0000</pubDate><author>web@jneidel.com (Jonathan Neidel)</author><guid>https://jneidel.com/essay/power-plant/</guid><description>&lt;blockquote&gt;
&lt;p&gt;The power plant doesn&amp;rsquo;t have power, it generates power.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Your body is that power plant.&lt;/p&gt;
&lt;p&gt;What is the result of thoughts like &amp;ldquo;I don&amp;rsquo;t have the energy&amp;rdquo; or &amp;ldquo;I am so tired&amp;rdquo;?
Will you feel energized and ready to go?
Or will you feel like you need to lie down and take a break?&lt;/p&gt;
&lt;p&gt;What if you stopped believing about yourself that you don&amp;rsquo;t have the energy to
do &lt;em&gt;x&lt;/em&gt;?
Would you have more or less energy?&lt;/p&gt;
&lt;p&gt;I am not suggesting that you deluge yourself.
You have to listen to your body.
If you are sick, give your body space.
If you are in a toxic and draining environment, get out.
If your batteries are empty, don&amp;rsquo;t push yourself.&lt;/p&gt;
&lt;p&gt;But challenge the limiting belief that you can&amp;rsquo;t.
Because usually you can.
But, your limiting belief is there for a reason.
What are your reasons?
Why do you want to feel like you have no energy?
What do you not have energy for?
What does it give you an excuse for?&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I really wanted to read that book/do that course/try that exercise, &lt;em&gt;but&lt;/em&gt; I&amp;rsquo;m always so tired after work.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Thinking you don&amp;rsquo;t have the energy right now gives you an excuse to sit on the couch and watch TV instead.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;The mental is one part.
The other is giving your body all it needs to generate power.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Real food.&lt;/li&gt;
&lt;li&gt;Enough water.&lt;/li&gt;
&lt;li&gt;Enough sleep.&lt;/li&gt;
&lt;li&gt;Enough movement.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;You know.
The basics.&lt;/p&gt;</description></item><item><title>My Backup strategy</title><link>https://jneidel.com/guide/backups/</link><pubDate>Fri, 05 Jan 2024 00:00:00 +0000</pubDate><author>web@jneidel.com (Jonathan Neidel)</author><guid>https://jneidel.com/guide/backups/</guid><description>&lt;p&gt;Everyone is responsible for backing up their own data.
In this guide I&amp;rsquo;ll walk you through how I do it.&lt;/p&gt;
&lt;h2 id="code-and-configurations" class="relative group"&gt;Code and configurations &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#code-and-configurations" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;My software projects and &lt;a href="https://github.com/jneidel/dotfiles" rel="external"&gt;linux configurations&lt;/a&gt; are versioned via git and use
&lt;a href="https://github.com/jneidel" rel="external"&gt;GitHub&lt;/a&gt; as a remote backup.
This relies on me committing and pushing changes regularly.&lt;/p&gt;
&lt;p&gt;My &lt;a href="https://github.com/jneidel/dotfiles" rel="external"&gt;dotfiles&lt;/a&gt; allow me to completely recreate my linux
setup in a few hours on a new device.&lt;/p&gt;
&lt;p&gt;Threat vectors covered: Main machine drive failure&lt;/p&gt;
&lt;h2 id="secrets" class="relative group"&gt;Secrets &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#secrets" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;I also version my secrets (password database, api keys, private configurations)
in git. Once a day a cronjob runs a copy of my &lt;a href="https://github.com/jneidel/dotfiles/tree/master/repo" rel="external"&gt;dotfiles repo management scripts&lt;/a&gt; that collect the relevant files, commits any changes and pushes to a private server.
You could also use private GitHub repos, but I rather keep my unencrypted
secrets on my own server.
Alternatively you could encrypt the files then you can store it where ever.
But this wouldn&amp;rsquo;t play well with git, since all files will be different every
time.&lt;/p&gt;
&lt;p&gt;Threat vectors covered: Main machine drive failure, revert undesired changes&lt;/p&gt;
&lt;h2 id="notes-and-laptopphone-media" class="relative group"&gt;Notes and laptop/phone media &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#notes-and-laptopphone-media" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;As detailed in my post about my &lt;a href="https://jneidel.com/guide/sync-notes/"&gt;Note synchronization setup&lt;/a&gt;
I use &lt;a href="https://syncthing.net" rel="external"&gt;Syncthing&lt;/a&gt; to sync
them to my homeserver (and from there to other devices.)
The same applies to music and any other media on my phone or computer.&lt;/p&gt;
&lt;p&gt;Syncthing offers &lt;a href="https://docs.syncthing.net/users/versioning.html" rel="external"&gt;multiple ways to version your files&lt;/a&gt; as to allow for retrival of
changed or deleted files. I only use this versioning on the homesever and vary
it based on the type of files being synced. For my notes I use &amp;ldquo;Simple&amp;rdquo; 45 day
versioning and for my media 20 day &amp;ldquo;Trash Can&amp;rdquo; versioning.&lt;/p&gt;
&lt;p&gt;Synchronization is not a backup though.
By being synced through my homeserver everything is also covered by it&amp;rsquo;s backup
strategy.&lt;/p&gt;
&lt;p&gt;Threat vectors covered: Main machine drive failure, revert undesired changes&lt;/p&gt;
&lt;h2 id="homeserver" class="relative group"&gt;Homeserver &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#homeserver" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;To project against disk failure I&amp;rsquo;m running &lt;a href="https://unraid.net" rel="external"&gt;UNRAID&lt;/a&gt;.
I opted for UNRAID over &lt;a href="https://en.wikipedia.org/wiki/RAID" rel="external"&gt;RAID&lt;/a&gt; for the ease of upgrading.
RAID would have required me to buy all of my hard-drives together.
I wasn&amp;rsquo;t sure how much storage I needed and wanted to reserve the option to
upgrade slowly instead of having a big upfront investment.&lt;/p&gt;
&lt;p&gt;RAID, or UNRAID in my case &lt;a href="https://www.raidisnotabackup.com/" rel="external"&gt;is not a backup&lt;/a&gt; though.
So besides my single parity disk I also have two external WD Elements drives for
on-site and off-site backups.
On-site is backed-up weekly and swapped with the off-site one at a relatives
place whenever I visit.
Any safe place outside of your house that you regularly visit will do.&lt;/p&gt;
&lt;p&gt;Threat vectors covered: Single drive failure&lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt;, multiple drive
failures&lt;sup id="fnref:2"&gt;&lt;a href="#fn:2" class="footnote-ref" role="doc-noteref"&gt;2&lt;/a&gt;&lt;/sup&gt;, &lt;a href="https://en.wikipedia.org/wiki/Ransomware" rel="external"&gt;Randsomware&lt;/a&gt;, environmental hazards at server location (fire, water, burglary)&lt;/p&gt;
&lt;p&gt;Reference:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.seagate.com/blog/what-is-a-3-2-1-backup-strategy" rel="external"&gt;3-2-1 Strategy&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://yewtu.be/watch?v=9seIRMZLpnc" rel="external"&gt;Ben Vallack&amp;rsquo;s backup strategy&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="technical-details" class="relative group"&gt;Technical details &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#technical-details" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h3&gt;&lt;p&gt;By encrypting our external backup drives we can secure our data against abuse.&lt;/p&gt;
&lt;p&gt;Threat vectors covered: External backup in the wrong hands&lt;/p&gt;
&lt;h4 id="initial-setup" class="relative group"&gt;Initial setup &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#initial-setup" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h4&gt;&lt;p&gt;Whenever I get a new drive that is to serve as a backup I have to test the drive
and put an encrypted filesystem on it.&lt;/p&gt;
&lt;h5 id="testing-the-drive" class="relative group"&gt;Testing the drive &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#testing-the-drive" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h5&gt;&lt;p&gt;To verify that the disk is fine run an extended SMART test on it.
I do this through the UNRAID UI, but I&amp;rsquo;m sure there is a way to do it on the
command-line. If there are any errors the drive gets returned to the seller.&lt;/p&gt;
&lt;p&gt;&lt;img alt="SMART test results in the UNRAID UI without errors" height="506" id="h-rh-i-0" src="https://jneidel.com/guide/backups/SMART-test-no-errors.png" width="1055"&gt;&lt;/p&gt;
&lt;p&gt;Next I&amp;rsquo;ll preclear the drive. This will:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;read out every byte&lt;/li&gt;
&lt;li&gt;write a zero to every byte&lt;/li&gt;
&lt;li&gt;read out every byte again&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This is technically unnecessary&lt;sup id="fnref:3"&gt;&lt;a href="#fn:3" class="footnote-ref" role="doc-noteref"&gt;3&lt;/a&gt;&lt;/sup&gt; but will serve as a stresstest for
the drive.
If it will fail early I want to know as soon as possible so I can return it.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Preclearing the drive" height="145" id="h-rh-i-1" src="https://jneidel.com/guide/backups/preclearing-drive.png" width="711"&gt;&lt;/p&gt;
&lt;p&gt;On UNRAID this can be done through the &amp;lsquo;Unassigned Devices Preclear&amp;rsquo;
plugin&lt;sup id="fnref:4"&gt;&lt;a href="#fn:4" class="footnote-ref" role="doc-noteref"&gt;4&lt;/a&gt;&lt;/sup&gt;.&lt;/p&gt;
&lt;h5 id="format-the-drive" class="relative group"&gt;Format the drive &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#format-the-drive" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h5&gt;&lt;p&gt;To access the drive without having to enter our passphrase every time&lt;sup id="fnref:5"&gt;&lt;a href="#fn:5" class="footnote-ref" role="doc-noteref"&gt;5&lt;/a&gt;&lt;/sup&gt; we
will generate a &lt;code&gt;keyfile&lt;/code&gt; that will be placed on the server.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;dd &lt;span class="nv"&gt;bs&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;512&lt;/span&gt; &lt;span class="nv"&gt;count&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;16&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/dev/random &lt;span class="nv"&gt;of&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;keyfile &lt;span class="nv"&gt;iflag&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;fullblock
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;With this we can now put an encrypted ext4 filesystem on our drive:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# optional: switch to admin&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo su
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# get the device id for the drive you want to format&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# -&amp;gt; replace sdX below&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;lsblk
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# format drive, generate and enter a passphrase&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cryptsetup -s &lt;span class="m"&gt;512&lt;/span&gt; luksFormat /dev/sdX
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# for keyfile unlock&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cryptsetup luksAddKey /dev/sdX keyfile
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# create filesystem&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cryptsetup luksOpen /dev/sdX cryptext --key-file keyfile
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mkfs.ext4 /dev/mapper/cryptext
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cryptsetup luksClose cryptext
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Now you&amp;rsquo;re ready to backup your server to this drive.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Reference: &lt;a href="https://wiki.archlinux.org/title/Dm-crypt/Device_encryption#Using_LUKS_to_format_partitions_with_a_keyfile" rel="external"&gt;Arch wiki section on disk encryption&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="update-external-backup" class="relative group"&gt;Update external backup &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#update-external-backup" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h4&gt;&lt;p&gt;To only transfer the changes between to the backup I use &lt;a href="https://rsync.samba.org/" rel="external"&gt;rsync&lt;/a&gt; – the
standard utility for this kind of job.&lt;/p&gt;
&lt;p&gt;On my server I run: &lt;code&gt;$ ./sync-backup sdd&lt;/code&gt; where &lt;code&gt;sdd&lt;/code&gt; specifies the device id of
my backup drive.
Here are the scripts contents:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#! /bin/sh
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;keyfile&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/mnt/user/system/user/keyfile
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;cryptmapper&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;cryptbackup
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;mapper&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/dev/mapper/&lt;span class="nv"&gt;$cryptmapper&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;mount_location&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/ext/backup
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mkdir -p &lt;span class="nv"&gt;$mount_location&lt;/span&gt; /ext/hd
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$1&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;--help&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$1&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;-h&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$1&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;help&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; -z &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$1&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; cat &lt;span class="s"&gt;&amp;lt;&amp;lt;EOF
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;$ sync-backup device_id
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;Backup data onto exsting backup drive
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;Parameters:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; \$1: like sdd, obtained from lsblk
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;Example:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; $ sync-backup sdd
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;EOF&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;exit&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;command&lt;/span&gt; -v rsync &amp;gt;/dev/null &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;rsync is not installed&amp;#34;&lt;/span&gt; 1&amp;gt;&lt;span class="p"&gt;&amp;amp;&lt;/span&gt;2&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nb"&gt;exit&lt;/span&gt; 127&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;device_id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;device&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/dev/&lt;span class="nv"&gt;$device_id&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cryptsetup luksOpen &lt;span class="nv"&gt;$device&lt;/span&gt; &lt;span class="nv"&gt;$cryptmapper&lt;/span&gt; --key-file &lt;span class="nv"&gt;$keyfile&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; Opened luks &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; sleep 4s &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; mount &lt;span class="nv"&gt;$mapper&lt;/span&gt; &lt;span class="nv"&gt;$mount_location&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; Mounted backup drive &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; rsync -avr --delete /mnt/user /boot &lt;span class="nv"&gt;$mount_location&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; sync &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; umount &lt;span class="nv"&gt;$mount_location&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; Unmounted backup drive &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; cryptsetup luksClose &lt;span class="nv"&gt;$cryptmapper&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; Closed luks
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="open-threat-vectors" class="relative group"&gt;Open threat vectors &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#open-threat-vectors" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;These I am aware off, but haven&amp;rsquo;t addressed yet, or we&amp;rsquo;re not worth addressing.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Data corruption due to electricity blackout:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Could be addressed by having the main power supply run through a battery. So
that if the power suddenly stops the battery keeps the server running so it
can gently shut-down. I don&amp;rsquo;t know how the intermediate battery would
communicate this shutdown to the server though and relying on me to manually
initiate shut-down would be error prone.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Software project environment files:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;While the project is backed up these env files are not necessarily.
I have not yet build a consistent way to best back these up.
Critical ones would be included in the secrets programme though.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you think I&amp;rsquo;m missing something here, please let me know at: &lt;a href="mailto:backups@jneidel.com" rel="external"&gt;backups@jneidel.com&lt;/a&gt;&lt;/p&gt;
&lt;div class="footnotes" role="doc-endnotes"&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id="fn:1"&gt;
&lt;p&gt;Covered by UNRAID&amp;rsquo;s parity. Plug in a new drive and the failed one will be recreated.&amp;#160;&lt;a href="#fnref:1" class="footnote-backref" role="doc-backlink"&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:2"&gt;
&lt;p&gt;With a single parity drive this mean UNRAID is failing. Data on the
lost drives is not recoverable and will have to be recreated from the
backup.&amp;#160;&lt;a href="#fnref:2" class="footnote-backref" role="doc-backlink"&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:3"&gt;
&lt;p&gt;If you want to add a new drive to an UNRAID array it is required to
be zeroed so it matches the parity. There is no such need in external drives.&amp;#160;&lt;a href="#fnref:3" class="footnote-backref" role="doc-backlink"&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:4"&gt;
&lt;p&gt;Install the plugins &amp;lsquo;Unassigned Devices&amp;rsquo; and &amp;lsquo;Unassigned Devices
Preclear&amp;rsquo;. Then in &amp;lsquo;Tools &amp;gt; Disk Utilities&amp;rsquo; you will have the option to preclear
a disk.&amp;#160;&lt;a href="#fnref:4" class="footnote-backref" role="doc-backlink"&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:5"&gt;
&lt;p&gt;This is optional. You can also skip this and enter a passphrase every time you mount the drive.&amp;#160;&lt;a href="#fnref:5" class="footnote-backref" role="doc-backlink"&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</description></item><item><title>One reason for a trip</title><link>https://jneidel.com/essay/trip-one-reason/</link><pubDate>Tue, 28 Nov 2023 00:00:00 +0000</pubDate><author>web@jneidel.com (Jonathan Neidel)</author><guid>https://jneidel.com/essay/trip-one-reason/</guid><description>&lt;blockquote&gt;
&lt;p&gt;Each trip must have a singular reason for why you&amp;rsquo;re taking it.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I used to live in the big city.
Wanting more peace and quiet I moved out into the countryside.
My work&lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt;, friends and family were still in the city though.&lt;/p&gt;
&lt;p&gt;Naturally I took regular trips&lt;sup id="fnref:2"&gt;&lt;a href="#fn:2" class="footnote-ref" role="doc-noteref"&gt;2&lt;/a&gt;&lt;/sup&gt; to the city.
And while there, I might as well get some parts from my old bike store, visit
this or that person, stop by at work, go to this event, get groceries from the
specialty stores (Asia, Turkish), etc.&lt;/p&gt;
&lt;p&gt;With time the amount of activities each trip consisted of grew.
Along with it grew my discontent.
I didn&amp;rsquo;t know why though.
Visiting my grandma felt like an obligation, instead of a pleasure – like it had before.&lt;/p&gt;
&lt;p&gt;When I was thinking about a trip and whether it was worth taking, I naturally
had started to take into account all the little things I would be doing.
I summed up the benefits of all the things I&amp;rsquo;d do and weighed them against the
cost (money, stress, time) of taking the trip.&lt;/p&gt;
&lt;p&gt;This made me resentful toward all the individual activities, because on their own
they were not worth the whole cost of the trip.
While doing an activity I wouldn&amp;rsquo;t think &amp;ldquo;Yeah, this was worth 20% of the trips
costs&amp;rdquo;, because even if that were true, that&amp;rsquo;s not how your brain works.&lt;/p&gt;
&lt;p&gt;At some point I came across this:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Each trip must have a singular reason for why you&amp;rsquo;re taking it.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I tried it.
Started deciding which trips to take based on a single activity.
Going to my best friend&amp;rsquo;s birthday for example.
That activity by itself was enough to justify the costs of the trip.
Meeting my grandma, cousin and another good friend were all extras on top I
could really enjoy this time.&lt;/p&gt;
&lt;p&gt;There was no pressure to enjoy the &amp;ldquo;side activities&amp;rdquo;, since there were &amp;ldquo;free.&amp;rdquo;
The cost of taking the trip was already &amp;ldquo;paid for&amp;rdquo; or justified by the main
activity, making these extra activities the cherry on top and much more
enjoyable.&lt;/p&gt;
&lt;p&gt;I now only take trips that can be justified by one activity alone.
It means I take less trips, but they are all more enjoyable.&lt;/p&gt;
&lt;div class="footnotes" role="doc-endnotes"&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id="fn:1"&gt;
&lt;p&gt;mostly remote, but they want to see my face around the office from time to time&amp;#160;&lt;a href="#fnref:1" class="footnote-backref" role="doc-backlink"&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:2"&gt;
&lt;p&gt;2h one way&amp;#160;&lt;a href="#fnref:2" class="footnote-backref" role="doc-backlink"&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</description></item><item><title>How to approach Technical Problems</title><link>https://jneidel.com/talk/tech-problems/</link><pubDate>Wed, 22 Nov 2023 00:00:00 +0000</pubDate><author>web@jneidel.com (Jonathan Neidel)</author><guid>https://jneidel.com/talk/tech-problems/</guid><description>&lt;div class="lead !mb-9 text-xl"&gt;
 A talk I held about how to approach technical problems.
&lt;/div&gt;

&lt;a
 class="inline-block !rounded-md bg-primary-600 px-4 py-1 !text-neutral !no-underline hover:!bg-primary-500 dark:bg-primary-800 dark:hover:!bg-primary-700"
 href="tech-problems.pdf"
 target="_blank"
 
 role="button"
&gt;
 
See the slides

&lt;/a&gt;

&lt;p&gt;All developers spend a lot of time debugging and finding solutions to technical
problems. We&amp;rsquo;ll step through some problems together and hopefully have some fun :)&lt;/p&gt;
&lt;p&gt;Audience: Developers and technically minded Testers&lt;/p&gt;
&lt;h2 id="solutions" class="relative group"&gt;Solutions &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#solutions" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;Here are my solutions to the presented problems in full.&lt;/p&gt;
&lt;h3 id="simple" class="relative group"&gt;Simple &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#simple" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h3&gt;&lt;p&gt;Just a &lt;a href="https://github.com/jneidel/oraclett/issues/52" rel="external"&gt;random issue&lt;/a&gt; I picked out for demo purposes.&lt;/p&gt;
&lt;h3 id="preowned" class="relative group"&gt;Preowned &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#preowned" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h3&gt;&lt;p&gt;Here&amp;rsquo;s an example of looking for newly added used Polo shirts on Momox, Zalando and AboutYou:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#! /bin/sh
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;OLD_LINKS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;~/.local/share/second-hand-polos.txt
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;TEMP&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;mktemp -u&lt;span class="k"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mkfifo &lt;span class="nv"&gt;$TEMP&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;fetch&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; curl -Ss &lt;span class="s1"&gt;&amp;#39;https://www.zalando.de/pre-owned-poloshirts-herren/ralph-lauren__groesse-M/?search_context=preowned&amp;amp;q=ralph+lauren+polo&amp;#39;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; grep -Po &lt;span class="s1"&gt;&amp;#39;&amp;lt;script type=&amp;#34;application/json&amp;#34; [^&amp;gt;]*&amp;gt;\K[^&amp;gt;]*(?=&amp;lt;/script&amp;gt;)&amp;#39;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; tail -n1 &lt;span class="p"&gt;|&lt;/span&gt; jq .graphqlCache &lt;span class="p"&gt;|&lt;/span&gt; gron &lt;span class="p"&gt;|&lt;/span&gt; grep -F &lt;span class="s1"&gt;&amp;#39;{\&amp;#34;id\&amp;#34;:\&amp;#34;ern:product::&amp;#39;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; gron -u &lt;span class="p"&gt;|&lt;/span&gt; jq &lt;span class="s1"&gt;&amp;#39;.[].data.product.uri&amp;#39;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; cut -d&lt;span class="se"&gt;\&amp;#34;&lt;/span&gt; -f2
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; curl -Ss &lt;span class="s1"&gt;&amp;#39;https://www.aboutyou.de/c/maenner/second-love/bekleidung/shirts/poloshirts-516659?brand=polo-ralph-lauren-4352&amp;amp;categoryShopFilterSizes=41157&amp;#39;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; grep -aPo &lt;span class="s1"&gt;&amp;#39;\{&amp;#34;productTile&amp;#34;:\{&amp;#34;product&amp;#34;:\{&amp;#34;id&amp;#34;:[^{]*path&amp;#34;:&amp;#34;\K[^&amp;#34;]*(?=[^{]*{)&amp;#39;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; awk &lt;span class="s1"&gt;&amp;#39;{ print &amp;#34;https://www.aboutyou.de&amp;#34;$1 }&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; curl -Ss &lt;span class="s1"&gt;&amp;#39;https://www.momoxfashion.com/de/herren/bekleidung/shirts/poloshirts?groesse=INM&amp;amp;marke=polo-ralph-lauren&amp;amp;farbe=schwarz_lila_blau_gruen_rot&amp;amp;material=baumwolle&amp;amp;sortiertnach=preis-aufsteigend&amp;#39;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; grep -Po &lt;span class="s1"&gt;&amp;#39;href=&amp;#34;\K/[^&amp;#34;]+(?=&amp;#34;.+item-link)&amp;#39;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; awk &lt;span class="s1"&gt;&amp;#39;{ print &amp;#34;https://www.momoxfashion.com/&amp;#34;$1 }&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cat &lt;span class="nv"&gt;$TEMP&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; xargs -r &lt;span class="nv"&gt;$B&lt;/span&gt; &amp;gt;/dev/null 2&amp;gt;&lt;span class="p"&gt;&amp;amp;&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt; &lt;span class="p"&gt;&amp;amp;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;fetch &lt;span class="p"&gt;|&lt;/span&gt; grep -vFf &lt;span class="nv"&gt;$OLD_LINKS&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; tee -a &lt;span class="nv"&gt;$OLD_LINKS&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; tee &lt;span class="nv"&gt;$TEMP&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This will work for most sites.&lt;/p&gt;
&lt;h3 id="automatic-login" class="relative group"&gt;Automatic Login &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#automatic-login" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h3&gt;&lt;p&gt;&lt;a href="https://www.tohodo.com/autofill" rel="external"&gt;The Autofill extension&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The extension for &lt;a href="https://keepassxc.org" rel="external"&gt;KeePassXC&lt;/a&gt; (my preferred Password
manager) also does autofilling once configured, but requires your password
database to be open.&lt;/p&gt;
&lt;h3 id="payments" class="relative group"&gt;Payments &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#payments" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h3&gt;&lt;p&gt;Nothing to show :)&lt;/p&gt;
&lt;h3 id="changelog" class="relative group"&gt;Changelog &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#changelog" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h3&gt;&lt;p&gt;Here&amp;rsquo;s the full script:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#! /bin/bash
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;DIR&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt; &lt;span class="nb"&gt;cd&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt; dirname &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;BASH_SOURCE&lt;/span&gt;&lt;span class="p"&gt;[0]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &amp;gt;/dev/null 2&amp;gt;&lt;span class="p"&gt;&amp;amp;&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;pwd&lt;/span&gt; &lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;CHANGELOG&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$DIR&lt;/span&gt;/../CHANGELOG.md
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;COOKIE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$DIR&lt;/span&gt;/../tmp/jira-cookie.txt
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;TMP_FEATURES&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$DIR&lt;/span&gt;/../tmp/FEATURES.md
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;TMP_FIXES&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$DIR&lt;/span&gt;/../tmp/FIXES.md
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;printf&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&amp;#34;&lt;/span&gt; &amp;gt;&lt;span class="nv"&gt;$TMP_FEATURES&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;printf&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&amp;#34;&lt;/span&gt; &amp;gt;&lt;span class="nv"&gt;$TMP_FIXES&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$1&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;--help&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$1&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;-h&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$1&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;help&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; cat &lt;span class="s"&gt;&amp;lt;&amp;lt;EOF
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;$ generate-changelog
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;Generate lines for the CHANGELOG.md file interactively.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;The commit up-to the last release are parsed and each Jira ticket id found
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;is presented to the user to add some tags.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;Flags:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; -c, --continue: continue the last release in the CHANGELOG,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; only looking at newly added commits
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; -I : launch in non-interactive mode
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;Example:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; $ generate-changelog -c
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;EOF&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;exit&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;command&lt;/span&gt; -v awk &amp;gt;/dev/null &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;awk is not installed&amp;#34;&lt;/span&gt; 1&amp;gt;&lt;span class="p"&gt;&amp;amp;&lt;/span&gt;2&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nb"&gt;exit&lt;/span&gt; 127&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;command&lt;/span&gt; -v jq &amp;gt;/dev/null &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;jq is not installed&amp;#34;&lt;/span&gt; 1&amp;gt;&lt;span class="p"&gt;&amp;amp;&lt;/span&gt;2&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nb"&gt;exit&lt;/span&gt; 127&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;command&lt;/span&gt; -v curl &amp;gt;/dev/null &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;curl is not installed&amp;#34;&lt;/span&gt; 1&amp;gt;&lt;span class="p"&gt;&amp;amp;&lt;/span&gt;2&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nb"&gt;exit&lt;/span&gt; 127&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;NON_INTERACTIVE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$1&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;-I&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$2&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;-I&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;NON_INTERACTIVE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;CONTINUE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$1&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;-c&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$2&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;-c&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$1&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;--continue&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$2&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;--continue&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;CONTINUE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mkdir -p &lt;span class="nv"&gt;$DIR&lt;/span&gt;/tmp
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;get_jira_cookie&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; ! -e &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$COOKIE&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; cat &lt;span class="s"&gt;&amp;lt;&amp;lt;EOF &amp;gt;&amp;amp;2
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;A Jira cookie is needed to make requests for issue title and tags.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;Go to your browser an make any authenticated Jira request with the network tab open.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;Paste the cookie request header into tmp/jira-cookie.txt like so:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;echo &amp;#34;Cookie: JSESSION_ID=...&amp;#34; &amp;gt;tmp/jira-cookie.txt
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;EOF&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;kill&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$$&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; cat &lt;span class="nv"&gt;$COOKIE&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;jira_request&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;URL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$1&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; curl &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$URL&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -H &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;get_jira_cookie&lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -Ss --compressed
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;get_title_from_jira&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;TICKET_ID&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$1&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;TMP_ERR&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;mktemp&lt;span class="k"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; jira_request &lt;span class="s2"&gt;&amp;#34;https://jira.endava.com/rest/api/2/issue/&lt;/span&gt;&lt;span class="nv"&gt;$TICKET_ID&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; jq .fields.summary 2&amp;gt;&lt;span class="nv"&gt;$TMP_ERR&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; cut -d&lt;span class="se"&gt;\&amp;#34;&lt;/span&gt; -f2- &lt;span class="p"&gt;|&lt;/span&gt; rev &lt;span class="p"&gt;|&lt;/span&gt; cut -d&lt;span class="se"&gt;\&amp;#34;&lt;/span&gt; -f2- &lt;span class="p"&gt;|&lt;/span&gt; rev &lt;span class="p"&gt;|&lt;/span&gt; tr &lt;span class="s2"&gt;&amp;#34; &amp;#34;&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;\n&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; grep -Five &lt;span class="s2"&gt;&amp;#34;[TVThek]&amp;#34;&lt;/span&gt; -e &lt;span class="s2"&gt;&amp;#34;[BE]&amp;#34;&lt;/span&gt; -e &lt;span class="s2"&gt;&amp;#34;[Backend]&amp;#34;&lt;/span&gt; -e &lt;span class="s2"&gt;&amp;#34;[FE]&amp;#34;&lt;/span&gt; -e &lt;span class="s2"&gt;&amp;#34;[Frontend]&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; sed &lt;span class="s1"&gt;&amp;#39;s|\[TVThek 24/7\]|[TVthek-24/7]|; s|\[CMS \(Sonata\)\]|[Sonata]|; s|\[TVthek 24/7 - Optimizations\]|[Optimizations]|&amp;#39;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; tr &lt;span class="s2"&gt;&amp;#34;\n&amp;#34;&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34; &amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; -s &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$TMP_ERR&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; cat &lt;span class="s"&gt;&amp;lt;&amp;lt;EOF &amp;gt;&amp;amp;2
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;Jira cookie has run out please refresh it.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;Go to your browser an make any authenticated Jira request with the network tab open.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;Paste the cookie request header into tmp/jira-cookie.txt like so:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;echo &amp;#34;Cookie: JSESSION_ID=...&amp;#34; &amp;gt;tmp/jira-cookie.txt
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;EOF&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;kill&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$$&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;get_tags_from_jira&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;TICKET_ID&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$1&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; jira_request &lt;span class="s2"&gt;&amp;#34;https://jira.endava.com/rest/api/2/issue/&lt;/span&gt;&lt;span class="nv"&gt;$TICKET_ID&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; jq &lt;span class="s1"&gt;&amp;#39;.fields.components | .[].name&amp;#39;&lt;/span&gt; 2&amp;gt;/dev/null &lt;span class="p"&gt;|&lt;/span&gt; awk -F&lt;span class="se"&gt;\&amp;#34;&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;{ print &amp;#34;[&amp;#34;$2&amp;#34;]&amp;#34; }&amp;#39;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; grep -ve &lt;span class="s2"&gt;&amp;#34;Backend&amp;#34;&lt;/span&gt; -e &lt;span class="s2"&gt;&amp;#34;Frontend&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; tr &lt;span class="s2"&gt;&amp;#34;\n&amp;#34;&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34; &amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;get_category_from_jira&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;TICKET_ID&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$1&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="k"&gt;$(&lt;/span&gt;jira_request &lt;span class="s2"&gt;&amp;#34;https://jira.endava.com/rest/api/2/issue/&lt;/span&gt;&lt;span class="nv"&gt;$TICKET_ID&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; jq .fields.issuetype.name&lt;span class="k"&gt;)&lt;/span&gt; in
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;&amp;#34;Bug&amp;#34;&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="nv"&gt;$TMP_FIXES&lt;/span&gt;&lt;span class="p"&gt;;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; *&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="nv"&gt;$TMP_FEATURES&lt;/span&gt;&lt;span class="p"&gt;;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;esac&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;get_commit_hash_to_continue_from&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; cat &lt;span class="nv"&gt;$CHANGELOG&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; tail -n+4 &lt;span class="p"&gt;|&lt;/span&gt; grep &lt;span class="s2"&gt;&amp;#34;^## &amp;#34;&lt;/span&gt; -m1 -B9999 &lt;span class="p"&gt;|&lt;/span&gt; grep &lt;span class="s2"&gt;&amp;#34;^### &amp;#34;&lt;/span&gt; -A2 &lt;span class="p"&gt;|&lt;/span&gt; grep -Eo &lt;span class="s2"&gt;&amp;#34;ORFDV001-[0-9]{4}&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; awk &lt;span class="s1"&gt;&amp;#39;{ print $1 }&amp;#39;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; awk &lt;span class="s1"&gt;&amp;#39;{ print &amp;#34;--grep=&amp;#34;$1 }&amp;#39;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; xargs git log --oneline -n1 &lt;span class="p"&gt;|&lt;/span&gt; awk &lt;span class="s1"&gt;&amp;#39;{ print $1 }&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;CURRENT_VERSION&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;git tag -l &lt;span class="p"&gt;|&lt;/span&gt; cut -d. -f1-2 &lt;span class="p"&gt;|&lt;/span&gt; tail -n1&lt;span class="k"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;PREVIOUS_VERSION&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;git tag -l &lt;span class="p"&gt;|&lt;/span&gt; cut -d. -f1-2 &lt;span class="p"&gt;|&lt;/span&gt; uniq &lt;span class="p"&gt;|&lt;/span&gt; tail -n2 &lt;span class="p"&gt;|&lt;/span&gt; head -n1&lt;span class="k"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;get_ticket_ids_until_commit_hash&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;COMMIT_HASH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$1&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; git log --oneline --no-decorate &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$COMMIT_HASH&lt;/span&gt;&lt;span class="s2"&gt;..HEAD&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; cut -d&lt;span class="se"&gt;\ &lt;/span&gt; -f2- &lt;span class="p"&gt;|&lt;/span&gt; grep -Eo &lt;span class="s2"&gt;&amp;#34;ORFDV001-[0-9]{4}&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; perl -ne &lt;span class="s1"&gt;&amp;#39;print unless $seen{$_}++&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;TMP&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;mktemp&lt;span class="k"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$CONTINUE&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; -eq &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; get_ticket_ids_until_commit_hash &lt;span class="k"&gt;$(&lt;/span&gt;git show-ref -s &lt;span class="k"&gt;$(&lt;/span&gt;git tag -l &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$PREVIOUS_VERSION&lt;/span&gt;&lt;span class="s2"&gt;.*&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; tail -n1&lt;span class="k"&gt;))&lt;/span&gt; &amp;gt;&lt;span class="nv"&gt;$TMP&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;else&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;CONTINUE_COMMIT_HASH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;get_commit_hash_to_continue_from&lt;span class="k"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;printf&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;%s\n%s \033[1;32m%s\033[0m %s\n&amp;#34;&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Continuing..&amp;#34;&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Taking into account the last:&amp;#34;&lt;/span&gt; &lt;span class="k"&gt;$(&lt;/span&gt;git log --oneline &lt;span class="nv"&gt;$CONTINUE_COMMIT_HASH&lt;/span&gt;..HEAD &lt;span class="p"&gt;|&lt;/span&gt; wc -l&lt;span class="k"&gt;)&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;commits&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; get_ticket_ids_until_commit_hash &lt;span class="nv"&gt;$CONTINUE_COMMIT_HASH&lt;/span&gt; &amp;gt;&lt;span class="nv"&gt;$TMP&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="nb"&gt;read&lt;/span&gt; -u &lt;span class="m"&gt;3&lt;/span&gt; ticket_id&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;-------------------------------------------------------------------------------------------&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;TICKET_ID&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="nv"&gt;$ticket_id&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; cut -c -13&lt;span class="k"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;TITLE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;get_title_from_jira &lt;span class="nv"&gt;$TICKET_ID&lt;/span&gt;&lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;printf&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;\033[1;32m%s\033[0m\n&amp;#34;&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$TITLE&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;https://jira.endava.com/browse/&lt;/span&gt;&lt;span class="nv"&gt;$TICKET_ID&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;TAGS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34; &lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;get_tags_from_jira &lt;span class="nv"&gt;$TICKET_ID&lt;/span&gt;&lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;TAGS: &amp;#39;&lt;/span&gt;&lt;span class="nv"&gt;$TAGS&lt;/span&gt;&lt;span class="s2"&gt;&amp;#39;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$NON_INTERACTIVE&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; -eq &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;read&lt;/span&gt; -p &lt;span class="s2"&gt;&amp;#34;Add tags any tags?: &amp;#34;&lt;/span&gt; tags
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;for&lt;/span&gt; word in &lt;span class="nv"&gt;$tags&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;TAGS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$TAGS&lt;/span&gt;&lt;span class="s2"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;$word&lt;/span&gt;&lt;span class="s2"&gt;] &amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;done&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;printf&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;\033[1;33m%s\033[0m\n&amp;#34;&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;*&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;TAGS&lt;/span&gt;&lt;span class="si"&gt;}${&lt;/span&gt;&lt;span class="nv"&gt;TITLE&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;\\#&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;TICKET_ID&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;*&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;TAGS&lt;/span&gt;&lt;span class="si"&gt;}${&lt;/span&gt;&lt;span class="nv"&gt;TITLE&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;\\#&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;TICKET_ID&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &amp;gt;&amp;gt; &lt;span class="k"&gt;$(&lt;/span&gt;get_category_from_jira &lt;span class="nv"&gt;$TICKET_ID&lt;/span&gt;&lt;span class="k"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;done&lt;/span&gt; 3&amp;lt;&lt;span class="nv"&gt;$TMP&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$CONTINUE&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; -eq &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ex &lt;span class="nv"&gt;$CHANGELOG&lt;/span&gt; &lt;span class="s"&gt;&amp;lt;&amp;lt;EOF
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;2 insert
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;## $CURRENT_VERSION (Deployed on DEPLOY_DATE_HERE)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;### Features
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;$(cat $TMP_FEATURES)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;### Fixes
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;$(cat $TMP_FIXES)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;xit
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;EOF&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;else&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ex &lt;span class="nv"&gt;$CHANGELOG&lt;/span&gt; &lt;span class="s"&gt;&amp;lt;&amp;lt;EOF
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;$(($(grep -n -m1 &amp;#34;^### Features&amp;#34; $CHANGELOG | cut -d: -f1)+2)) insert
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;$(cat $TMP_FEATURES)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;$(($(grep -n -m1 &amp;#34;^### Fixes&amp;#34; $CHANGELOG | cut -d: -f1)+3)) insert
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;$(cat $TMP_FIXES)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;xit
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;EOF&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Here&amp;rsquo;s a project I converted to convential commits, which is a lot nicer:
&lt;a href="https://github.com/jneidel/dotfiles/tree/master/repo/changelog" rel="external"&gt;scripts&lt;/a&gt;,
&lt;a href="https://github.com/jneidel/dotfiles/blob/master/repo/release" rel="external"&gt;release script&lt;/a&gt;&lt;/p&gt;
&lt;h3 id="mail-signups" class="relative group"&gt;Mail signups &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#mail-signups" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h3&gt;&lt;p&gt;You can find the &lt;a href="https://github.com/jneidel/yoga-vidya-thunderbird2csv-add-on" rel="external"&gt;repo&lt;/a&gt; here.&lt;/p&gt;
&lt;h3 id="subtitles" class="relative group"&gt;Subtitles &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#subtitles" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h3&gt;&lt;p&gt;Here&amp;rsquo;s how you can overwrite a mimetype on &lt;code&gt;Symfony\MimeTypes&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# config/services.yml&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;services&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;mime_types&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;class&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;Symfony\Component\Mime\MimeTypes&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;arguments&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;&amp;#39;application/ttml+xml&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;ttml&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;calls&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;setDefault&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;@mime_types&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;sonata.media.metadata.amazon&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;class&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;Sonata\MediaBundle\Metadata\AmazonMetadataBuilder&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;arguments&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="s1"&gt;&amp;#39;@mime_types&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="slowdown" class="relative group"&gt;Slowdown &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#slowdown" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h3&gt;&lt;p&gt;Here&amp;rsquo;s an &lt;a href="https://chat.openai.com/share/a00bb199-e75d-49b7-8e0e-577976efd5f4" rel="external"&gt;example of asking ChatGPT&lt;/a&gt; to check you&amp;rsquo;re not missing anything.&lt;/p&gt;
&lt;p&gt;And here&amp;rsquo;s the &lt;a href="https://unix.stackexchange.com/questions/120042/linux-slows-down-after-long-uptime" rel="external"&gt;Stack Overflow post&lt;/a&gt; that was my fix.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Reach out&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;That it!&lt;/p&gt;
&lt;p&gt;If there are any questions/notes feel free to reach out to me:
&lt;a href="mailto:tech-problems@jneidel.com" rel="external"&gt;tech-problems@jneidel.com&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Syncing text notes between multiple devices</title><link>https://jneidel.com/guide/sync-notes/</link><pubDate>Mon, 13 Nov 2023 00:00:00 +0000</pubDate><author>web@jneidel.com (Jonathan Neidel)</author><guid>https://jneidel.com/guide/sync-notes/</guid><description>&lt;p&gt;If you&amp;rsquo;re not using a note-taking app that handles synchronization for you,
you&amp;rsquo;ll have to find a different solution.&lt;/p&gt;
&lt;p&gt;This guide is going to detail how I use &lt;a href="https://syncthing.net" rel="external"&gt;Syncthing&lt;/a&gt; for
all my synchronization needs and how I use &lt;a href="https://signal.org" rel="external"&gt;Signal&lt;/a&gt; as my
notes inbox.&lt;/p&gt;
&lt;h2 id="syncthing" class="relative group"&gt;Syncthing &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#syncthing" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;h3 id="why-syncthing" class="relative group"&gt;Why Syncthing &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#why-syncthing" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;it just works™&lt;/li&gt;
&lt;li&gt;open source&lt;/li&gt;
&lt;li&gt;feels-like-instant sync&lt;/li&gt;
&lt;li&gt;works behind CGNAT routers (no outgoing IP address)&lt;/li&gt;
&lt;li&gt;nice web-inteface for management&lt;/li&gt;
&lt;li&gt;decent memory/cpu usage
&lt;ul&gt;
&lt;li&gt;Has configurable run conditions on the phone to e.g. only run while being charged&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;you don&amp;rsquo;t have worry about storage costs with a cloud provider
&lt;ul&gt;
&lt;li&gt;Dropbox&amp;rsquo;s free plan is a paltry 2GB&lt;/li&gt;
&lt;li&gt;my notes are 30GB and I don&amp;rsquo;t have to care&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;ignore patterns
&lt;ul&gt;
&lt;li&gt;very useful for caches, node_modules, vendor, etc.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;nested folders (more on that later)&lt;/li&gt;
&lt;li&gt;built-in versioning
&lt;ul&gt;
&lt;li&gt;so you can easily revert unintentional changes/deletions&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="between-computers" class="relative group"&gt;Between computers &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#between-computers" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h3&gt;&lt;p&gt;My most basic use case was syncing my notes between my work and personal
computer. My &lt;a href="https://github.com/jneidel/dotfiles" rel="external"&gt;setup&lt;/a&gt; is running on both
machines, with some tweaks depending specific on the device, all I need is to
plug in my notes.&lt;/p&gt;
&lt;p&gt;You can sync directly between the machines:&lt;/p&gt;
&lt;div class="mermaid" align="center"&gt;
 
stateDiagram-v2
 Work --&gt; Personal
 Personal --&gt; Work

&lt;/div&gt;

&lt;p&gt;But I would recommend you put a server in between, so you can also sync without
them both being online at the same time (e.g. you close the one machine and open the other.)&lt;/p&gt;
&lt;div class="mermaid" align="center"&gt;
 
stateDiagram-v2
 Server --&gt; Personal
 Server --&gt; Work
 Work --&gt; Server
 Personal --&gt; Server

&lt;/div&gt;

&lt;h3 id="between-phone-and-computer" class="relative group"&gt;Between phone and computer &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#between-phone-and-computer" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h3&gt;&lt;p&gt;I&amp;rsquo;m using &lt;a href="https://f-droid.org/en/packages/com.github.catfriend1.syncthingandroid/" rel="external"&gt;Syncthing-Fork&lt;/a&gt; on my phone.
The dynamic is much the same:&lt;/p&gt;
&lt;div class="mermaid" align="center"&gt;
 
stateDiagram-v2
 Server --&gt; Phone
 Phone --&gt; Server
 Server --&gt; Computer
 Computer --&gt; Server

&lt;/div&gt;

&lt;p&gt;I have a media sync with my music library, podcasts, movies, etc. To only sync
parts of this I can use nested folders and only expose a subset to my phone:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-txt" data-lang="txt"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;└── media &amp;lt;-- syncthing folder 1
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ├── movies
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ├── music
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ └── symlink to ../phone/music
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; └── phone &amp;lt;-- syncthing folder 2
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ├── podcasts
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; └── music
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Like this I can add new music and podcasts from my computer and delete stuff I heard
podcasts from my phone.
Much easier than the manual ftp moving I did before.&lt;/p&gt;
&lt;p&gt;With the symlink I have the phones music integrated into my mpd setup, which
will automatically have deletion from the phone of song I don&amp;rsquo;t like synced.&lt;/p&gt;
&lt;h3 id="the-server" class="relative group"&gt;The server &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#the-server" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h3&gt;&lt;p&gt;Syncthing runs fine even on a Raspberry Pi.
I have it running on my homeserver, where the data is included in my regular
backups.&lt;/p&gt;
&lt;h2 id="signal-as-an-inbox" class="relative group"&gt;Signal as an inbox &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#signal-as-an-inbox" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;I only use my phone to jot down notes, not to read them.&lt;/p&gt;
&lt;p&gt;My unoptimized workflow was me writing into a Signal chat with myself and
copying out the notes on my computer.
The obvious improvement was to automate that by having a script read out the
signal chat and create notes out of the messages.&lt;/p&gt;
&lt;p&gt;I have done that by creating a script that parses the signal cli app.
You can find out everything about it in it&amp;rsquo;s repository: &lt;a href="https://github.com/jneidel/signal-cli-to-file" rel="external"&gt;signal-cli-to-file&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;With my current workflow I can easily jot down a note in Signal and have it
delivered into my note-taking system.
I also routinely forward messages from other chats, emails, photos, PDFs and
whatever else I might run across on my phone.&lt;/p&gt;</description></item><item><title>Intermittent Fasting: An easy addition to a working diet</title><link>https://jneidel.com/review/intermittent-fasting/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><author>web@jneidel.com (Jonathan Neidel)</author><guid>https://jneidel.com/review/intermittent-fasting/</guid><description>&lt;h2 id="what-is-intermittent-fasting" class="relative group"&gt;What is intermittent fasting? &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#what-is-intermittent-fasting" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;Restrict your eating to a certain time window.
The notation for describing eating and fasting times is this: 16-8.
Which means: 16 hours of fasting and 8 hours of eating.&lt;/p&gt;
&lt;h2 id="why-do-it" class="relative group"&gt;Why do it? &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#why-do-it" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;Digestion is an energy intense process for your body.
If you give your body a window of fasting, it is able to actually finishing the
digestion process and trigger repair mechanisms.&lt;/p&gt;
&lt;p&gt;Only after 10-12h of fasting will your body start to repurpose aged cells and
reduce inflammation. This positively impacts the immune system.&lt;/p&gt;
&lt;h2 id="how-i-applied-it-in-my-life" class="relative group"&gt;How I applied it in my life &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#how-i-applied-it-in-my-life" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;When I first heard of intermittent fasting and especial 16-8, it sounded
crazy to me.
How is that gonna work? I&amp;rsquo;m just gonna be hungry. Why would I do that to
myself?
I tried it a bit and it was a lot of effort and not worth it at all.&lt;/p&gt;
&lt;p&gt;Time passed.
I worked on my diet and found something that fills me and gives me energy
for a long time.
And then I stumbled over intermittent fasting again.&lt;/p&gt;
&lt;p&gt;I was already not eating 2:30h before going to bed (as this negatively
impacts sleep quality, digestions diverts energy away from recovery.)
I counted the hours and as it turns out, I was basically already doing an
intermittent fasting schedule of 12-12.&lt;/p&gt;
&lt;p&gt;So, I decided to just try 14-10, (it&amp;rsquo;s just a small change after all), by
eating the last meal 2h earlier.
During the day I never felt hungry.
Only in the morning, but that was already the case before :smile:&lt;/p&gt;
&lt;p&gt;At this point I was only eating breakfast and lunch.
It felt natural to just eat breakfast earlier.
So, 16-8 happened automatically.&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th style="text-align: center"&gt;Eating schedule&lt;/th&gt;
 &lt;th style="text-align: center"&gt;Eating window example&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td style="text-align: center"&gt;12-12&lt;/td&gt;
 &lt;td style="text-align: center"&gt;6:00 - 18:00&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: center"&gt;14-10&lt;/td&gt;
 &lt;td style="text-align: center"&gt;6:00 - 16:00&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: center"&gt;16-8&lt;/td&gt;
 &lt;td style="text-align: center"&gt;6:00 - 14:00&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="skip-breakfast-or-dinner" class="relative group"&gt;Skip breakfast or dinner? &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#skip-breakfast-or-dinner" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;blockquote&gt;
&lt;p&gt;Breakfast is the most important meal of the day.
&lt;br&gt;– A cereal commercial&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The industry is trying to sell you something with that quote, but there is
some truth to it.&lt;/p&gt;
&lt;p&gt;In the morning your body is the most efficient at processing
food&lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt;.
Eating soon after waking also signals to your inner clock that the day is
starting.&lt;/p&gt;
&lt;!-- [^losgeht]. --&gt;
&lt;p&gt;Both eating savory in the morning and eating soon after waking up (ideal is
the slot 30 mins to 1.5h after waking) took some getting used to.
But, I do feel better with this schedule than without it.&lt;/p&gt;
&lt;h2 id="what-about-the-benefits" class="relative group"&gt;What about the benefits? &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#what-about-the-benefits" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;For me and the way I have integrated intermittent fasting in my life, there
a few to no costs.
The only one that comes to mind, is not being able to eat dinner.
But, I do make exceptions for some dinner (happens rarely.)
That means, that any upside, any positive effect that intermittent fasting
has on me, I basically get for free.&lt;/p&gt;
&lt;p&gt;For me, there is not much of an effect that I have observed.
I have always had a good immune system and no problems with inflammation.
Just knowing that it&amp;rsquo;s good for my body is enough for me.&lt;/p&gt;
&lt;p&gt;Most of the benefits that people report after starting intermittent fasting
I would attribute to be the result of eating better.
Because you can&amp;rsquo;t do &lt;abbr title="intermittent fasting"&gt;IF&lt;/abbr&gt; and eat
like crap.
That is gonna be torture.
And for a lot of people, who try &lt;abbr title="intermittent fasting"&gt;IF&lt;/abbr&gt;,
it is torture.&lt;/p&gt;
&lt;h2 id="alarms--tracking" class="relative group"&gt;Alarms &amp;amp; Tracking &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#alarms--tracking" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;As you can imagine I don&amp;rsquo;t need to set alarms or anything.
My body is hungry in the morning and then knows when it&amp;rsquo;s time for lunch.
Easy.&lt;/p&gt;
&lt;p&gt;I do have &lt;abbr title="intermittent fasting"&gt;IF&lt;/abbr&gt; in my habit tracker,
just so I don&amp;rsquo;t forget about it.
Because actions that are easy and automated can easily slip my mind with the
passage of time.&lt;/p&gt;
&lt;h2 id="exceptions-to-the-schedule" class="relative group"&gt;Exceptions to the schedule &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#exceptions-to-the-schedule" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;I do break the intermittent fasting rule occasionally.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;There was no earlier opportunity for me to eat.&lt;/li&gt;
&lt;li&gt;There is a dinner, which doubles as a social occasion, that I want to
participate attend.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The results is always the same: I feel worse.
But, I can&amp;rsquo;t solely attribute that to breaking my intermittent fasting rule,
because it usually coincides with other rule breaks, such as: eating sugar,
eating less than 2.5h before bed or eating in a way that spikes my blood
sugar.&lt;/p&gt;
&lt;p&gt;I am aware of these costs and if the dinner is important to me, I will bear
them.&lt;/p&gt;
&lt;h2 id="conclusion" class="relative group"&gt;Conclusion &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#conclusion" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;Intermittent fasting is very easy to do, if your diet already gives you
energy for at least 6-8h.
And that&amp;rsquo;s a big if.&lt;/p&gt;
&lt;p&gt;Intermittent fasting itself you set up once and then don&amp;rsquo;t think about it
much.
Benefits for me only exist on paper, but that&amp;rsquo;s fine, since it&amp;rsquo;s such an
easy fix.&lt;/p&gt;
&lt;div class="footnotes" role="doc-endnotes"&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id="fn:1"&gt;
&lt;p&gt;In the morning your body is best at producing Insulin.
Insulin stimulates the processing and absorption of (blood) sugar.
This means, that your body can more easily convert food into energy and
instead of storing it as fat.&amp;#160;&lt;a href="#fnref:1" class="footnote-backref" role="doc-backlink"&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</description></item><item><title>What I'm doing now</title><link>https://jneidel.com/now/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><author>web@jneidel.com (Jonathan Neidel)</author><guid>https://jneidel.com/now/</guid><description>&lt;p&gt;&lt;em&gt;&lt;sub&gt;
This is a &lt;a href="https://nownownow.com/about" rel="external"&gt;now&lt;/a&gt; page.
&lt;span class="px-3"&gt;·&lt;/span&gt;
See also: &lt;a href="https://jneidel.com/about/"&gt;about me&lt;/a&gt;&lt;/em&gt;
&lt;/sub&gt;&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m still happily living in rural &lt;a href="https://www.openstreetmap.org/way/981943938" rel="external"&gt;south Brandenburg&lt;/a&gt; with my wife.
Three days a week I work as a backend developer at a &lt;a href="https://www.endava.com" rel="external"&gt;software agency&lt;/a&gt;.
I&amp;rsquo;m open to new employment or freelancing options.&lt;/p&gt;
&lt;h2 id="active-projects" class="relative group"&gt;Active Projects &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#active-projects" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;These are the project I&amp;rsquo;m currently working on. (List is updated daily.)&lt;/p&gt;
&lt;p&gt;&lt;noscript&gt;With JavaScript enabled you would see a dynamically included list of my projects here :)&lt;/noscript&gt;&lt;/p&gt;
&lt;script&gt;
(async () =&gt; {
const json = await fetch("now.json").then(res =&gt; res.json());
document.querySelector("time").innerText = "Updated: " + json.date_updated;

let html = "";
for (const { title, status, description } of json.projects) {
 html += `
 &lt;p&gt;
 &lt;strong&gt;${title}&lt;/strong&gt;
 ${description &amp;&amp; "&lt;br&gt;" + decodeURIComponent(description)}
 ${status &amp;&amp; "&lt;br&gt;&lt;strong&gt;Status&lt;/strong&gt;: " + status}
 &lt;/p&gt;
 `;
}

document.getElementById("active-projects").nextSibling.insertAdjacentHTML("afterend", html);
})()
&lt;/script&gt;
&lt;details&gt;
&lt;summary&gt;FAQ&lt;/summary&gt;
&lt;br&gt;
&lt;details&gt;
&lt;summary&gt;How do you define a project?&lt;/summary&gt;
&lt;p&gt;My note-taking system is based on &lt;a href="https://fortelabs.com/" rel="external"&gt;Tiago Fortes&lt;/a&gt; PARA method, which defines a projects as short-term efforts that you&amp;rsquo;re working on now.
Which have:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;A begining and an end.&lt;/li&gt;
&lt;li&gt;A specific outcome to achieve.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;I use the above a guideline, rather than a strict rule.
To me, every ongoing personal workstream should be represted by a project.
If some work includes multiple todos over a certain time period it is a project.&lt;/p&gt;
&lt;/details&gt;
&lt;br&gt;
&lt;details&gt;
&lt;summary&gt;How does the automatic updating work?&lt;/summary&gt;
&lt;p&gt;Here is the &lt;a href="https://jneidel.com/dev/automatic-now-updates/"&gt;article&lt;/a&gt; I wrote about my setup.&lt;/p&gt;
&lt;/details&gt;
&lt;br&gt;
&lt;details&gt;
&lt;summary&gt;What's with the titles?&lt;/summary&gt;
&lt;p&gt;Some of them might be in German.
That is in the nature of &lt;a href="https://jneidel.com/dev/automatic-now-updates/"&gt;how I set this up&lt;/a&gt;.
Essentially, what you see here is directly pulled from my note-taking system and the titles first and foremost need to serve my organizational needs.&lt;/p&gt;
&lt;p&gt;As the structure of the title, I have two kinds:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Reflective of the action performed by the project.
Tiago recommends verbs that imply completion like &amp;ldquo;finalize&amp;rdquo;, &amp;ldquo;green-light&amp;rdquo;, &amp;ldquo;launch&amp;rdquo;, or &amp;ldquo;publish&amp;rdquo;.&lt;/li&gt;
&lt;li&gt;Statement of what it is.
&amp;ldquo;book: NAME&amp;rdquo; is a book I&amp;rsquo;m reading. I find this format easier to parse than &amp;ldquo;read NAME&amp;rdquo;.
&amp;ldquo;taxes YEAR&amp;rdquo; is another example, where I prefer the simple statement over a &amp;ldquo;do taxes YEAR&amp;rdquo;.&lt;/li&gt;
&lt;/ol&gt;
&lt;/details&gt;
&lt;p&gt;Ich hatte eine etwas andere &lt;a href="https://github.com/jneidel/jneidel.com/blob/5db16d4161e32176181e30ec111c6407c5374a14/content/now/index.md" rel="external"&gt;Variante&lt;/a&gt; ausprobiert.
Letztendlich bin
&lt;br&gt;&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;Why did you choose this way of doing your now page?&lt;/summary&gt;
&lt;p&gt;I like the idea of the &lt;a href="https://nownownow.com/about" rel="external"&gt;now page&lt;/a&gt;, but I don&amp;rsquo;t like maintaining one.
Having a reminder in my calendar works, but was just annoying to do and I did not do it.
With the current approach I simply give the reader the option to look into what I already do anyway: my project management.
For me it only requires a tiny amount of extra work, which is even well integrated into my system.
The simplicity means I will actually do it.&lt;/p&gt;
&lt;/details&gt;
&lt;/details&gt;
&lt;h2 id="daily-habits" class="relative group"&gt;Daily Habits &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#daily-habits" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;These activites are part of my every day routine.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Walk in nature (60+ mins)&lt;/li&gt;
&lt;li&gt;Wim Hof breathing&lt;/li&gt;
&lt;li&gt;Eat a majority &lt;a href="https://jneidel.de/project/rohkost/" rel="external"&gt;raw&lt;/a&gt;&lt;sup&gt;
 &lt;abbr class="no-underline" title="The linked article is in German."&gt;:de:&lt;/abbr&gt;
&lt;/sup&gt;
, &lt;a href="https://jneidel.com/project/going-vegan/"&gt;vegan&lt;/a&gt; diet with &lt;a href="https://jneidel.com/review/intermittent-fasting/"&gt;IF&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Exercise&lt;/li&gt;
&lt;/ul&gt;

 
 
 
 
 
 
 

 
 
 

 
 

 
 
 
 
 
 &lt;figure class="w-12/12 mx-auto my-0 rounded-sm"&gt;
 &lt;img src="./forest-walk.jpg" alt="Path in a forest" class="w-12/12 mx-auto my-0 rounded-sm"/&gt;
 &lt;figcaption class="text-center"&gt;I practically have the local forest to myself :slightly_smiling_face:&lt;/figcaption&gt;
 &lt;/figure&gt;

</description></item></channel></rss>