arnaucube
arnaucube/arnaucube.comPublic Self-hosted repository
arnaucube.com/blog/tools.html
blog/tools.htmlRaw
  1<!DOCTYPE html>
  2<html lang="en">
  3
  4  <head>
  5    <meta name="description" content="A non-exhaustive overview of tools I use daily." />
  6    <meta charset="utf-8">
  7    <title> Tools - arnaucube - blog</title>
  8    <meta name="title" content=" Tools - arnaucube - blog">
  9    <meta name="description" content="A non-exhaustive overview of tools I use daily.">
 10
 11    <meta property="og:title" content=" Tools - arnaucube - blog" />
 12    <meta property="og:description" content="A non-exhaustive overview of tools I use daily." />
 13    <meta property="og:url" content="https://arnaucube.com/blog/tools.html" />
 14    <meta property="og:type" content="article" />
 15    <meta property="og:image" content="https://arnaucube.com/blog/img/posts/tools/tools-preview.png" />
 16    <meta name="twitter:title" content=" Tools - arnaucube - blog">
 17    <meta name="twitter:description" content="A non-exhaustive overview of tools I use daily.">
 18    <meta name="twitter:image" content="https://arnaucube.com/blog/img/posts/tools/tools-preview.png">
 19    <meta name="twitter:card" content="summary_large_image">
 20    <meta name="author" content="arnaucube">
 21
 22    <link rel="icon" type="image/png" href="img/logoArnauCubeFavicon.png">
 23
 24    <meta name="viewport" content="width=device-width, initial-scale=1">
 25
 26    <link href="css/bootstrap.min.css" rel="stylesheet">
 27    <link rel="stylesheet" href="css/style.css">
 28
 29    <!-- highlightjs -->
 30    <!-- <link rel="stylesheet" href="js/highlightjs/atom-one-dark.css"> -->
 31    <link rel="stylesheet" href="js/highlightjs/atom-one-light.css">
 32    <!-- <link rel="stylesheet" href="js/highlightjs/gruvbox-dark.css"> -->
 33    <script src="js/highlightjs/highlight.pack.js"></script>
 34
 35    <!-- katex -->
 36    <link rel="stylesheet" href="js/katex/katex.min.css">
 37  <link rel="alternate" type="application/rss+xml" title="arnaucube - blog RSS" href="https://arnaucube.com/blog/rss.xml">
 38</head>
 39
 40  <body>
 41
 42    <!-- o_gradient_background" -->
 43    <nav id="mainNav" class="navbar navbar-default navbar-fixed-top"
 44                      style="height:50px;font-size:100%;">
 45      <div class="container">
 46        <div style="float:left;">
 47        <a href="/blog" style="color:#000;display:inline-block;">blog</a>
 48        <span style="margin-right:20px; margin-left:20px;">|</span>
 49        <a href="/blog/notes.html" style="font-size:90%;color:#000;display:inline-block;">notes</a>
 50        </div>
 51        <div style="float:right;">
 52          <a href="/" style="color:#000;display:inline-block;margin-right:10px;">arnaucube.com</a>
 53          <a href="/blog/rss.xml" target="_blank"
 54            type="application/rss+xml" title="subscribe via RSS" aria-label="subscribe via RSS">
 55              <img width="12px;" src="img/rss.png" />
 56          </a>
 57          <div class="onoffswitch" style="margin-left:0px;display:inline-block;" title="change theme">
 58            <input onclick="switchTheme()" type="checkbox" name="onoffswitch" class="onoffswitch-checkbox"
 59              id="themeSwitcher">
 60            <label class="onoffswitch-label" for="themeSwitcher"></label>
 61          </div>
 62        </div>
 63      </div>
 64      <!-- <img style="height:5px; width:100%; margin-top:8px;" src="img/gradient-line.jpg" /> -->
 65    </nav>
 66
 67
 68    <div class="container" style="max-width:800px;">
 69        <br>
 70        <div style="background:#cccccc; border:2px gray solid; padding:5px; width:80%;margin-left:auto; margin-right:auto; margin-bottom:5px;">
 71          <i>Note: this blog is human-written, no AI generated content.</i>
 72        </div>
 73
 74      <h1>Tools</h1>
 75
 76<p><em>2026-06-08</em></p>
 77
 78<p>A non-exhaustive overview of tools I use daily.</p>
 79
 80<p><em>I had this post half-written for a couple of years, finally I&rsquo;ve put the time to &lsquo;complete&rsquo; it enough to publish it. See it as a kind of email to a friend sharing my ways of approaching everyday tools.</em></p>
 81
 82<h2>in general</h2>
 83
 84<ul>
 85<li>Always be willing to <strong>customize and optimmize</strong> the tools you use</li>
 86<li>Usually closed source tools come with &lsquo;defaults&rsquo; that may &lsquo;suit the majority&rsquo; (or that it&rsquo;s acceptable enough), but does not mean that you have to conform with it. This is another reason (from many) to use freesoftware or if not, opensource.</li>
 87<li>when willing to use a tool, if it is closed source, always check <strong>free software / opensource</strong> alternatives, usually they exist and have an active community around them</li>
 88<li>prefer <strong>terminal</strong> tools over GUI tools. In this way, working remotely inside a server feels the same as working locally in your laptop, just the terminal and the tool in there</li>
 89<li>prefer offline tools than online tools</li>
 90<li>In physical objects optimize for <strong>portability</strong>; also usually is good to not centralize many functions in a single object</li>
 91</ul>
 92
 93<h2>computer</h2>
 94
 95<ul>
 96<li>in general
 97
 98<ul>
 99<li>maximize keyboard shortcuts, and minimize keyboard surface
100
101<ul>
102<li>I use a <strong>40% keyboard, <a href="https://github.com/foostan/crkbd">corne</a></strong> keyboard</li>
103<li>the idea is that instead of moving your fingers to the keys, you want to move the keys under your fingers (eg. for numbers &amp; symbols, F1 keys, etc)
104<div style="text-align:center;">
105<a target="_blank" href="img/posts/tools/corne.png"><img style="width:60%" src="img/posts/tools/corne.png"></img></a>
106<br>
107<i style="font-size:75%">the Corne keyboard I use, self-assembled and soldered</i>
108</div></li>
109</ul></li>
110<li><strong>minimize mouse</strong> usage:
111
112<ul>
113<li>using the mouse means lifting the fingers from the keyboard</li>
114<li>mouse limits an entire hand to only click buttons, you have many more fingers to use</li>
115<li>so, naturally, <strong><a href="https://www.vim.org">vim</a> &amp; <a href="https://neovim.io">neovim</a></strong> as code and text editors
116
117<ul>
118<li>also this has the benefit that working in my laptop or working in the server feels the same</li>
119</ul></li>
120<li>window manager: till last year I was using <a href="https://i3wm.org">i3</a>, now I&rsquo;m using <a href="https://swaywm.org">sway</a>. The main idea is to be able to move quick across windows and panels, while avoiding touching the mouse.</li>
121</ul></li>
122<li>automate:
123
124<ul>
125<li>this is, bash &amp; python scripts are very useful; for almost every task that has more than 3 iterations of the same steps</li>
126<li>OS: of course, Linux. For the past 3 years I&rsquo;ve been using <a href="https://nixos.org">NixOS</a>, attracted by it&rsquo;s imperative philosophy: you have a set of config files, format a laptop, load your config, and you have all your software with your configurations ready to use (ie. not manually {apt/pacman}-installing each software package)</li>
127</ul></li>
128</ul></li>
129</ul>
130
131<p>This is not only for code files; for example, when working on a <span class="math inline">\(LaTeX\)</span> document, edit it in neovim with <a href="https://github.com/lervag/vimtex">vimtex</a>, so that at save it re-renders the pdf and reloads it in <a href="https://pwmt.org/projects/zathura/">zathura</a>. Additionally, this works great while being offline, compared to mainstream options such as overleaf.
132Similarly, when working on a markdown document, use <a href="https://github.com/arnaucube/md-live-server">md-live-server</a> locally, splitting the screen between the terminal for editing and <a href="https://qutebrowser.org/">qutebrowser</a>, so that no mouse is needed any time.</p>
133
134<div style="text-align:center;">
135<a target="_blank" href="img/posts/tools/desk-setup.jpg"><img style="width:75%" src="img/posts/tools/desk-setup.jpg"></img></a>
136<br>
137<i style="font-size:75%">a bit old (~2023) desk setup, with my 'old' Thinkpad Carbon X1</i>
138</div>
139
140<h4>devices</h4>
141
142<!-- TODO picture corne + screens -->
143
144<ul>
145<li>At home:
146
147<ul>
148<li>I build a ~850 euros server (year 2024), with AMD Ryzen 9 5900XT 3.3 GHz 16-Core, 64 GB of RAM.</li>
149<li>to work, I usually <a href="https://mosh.org/">mosh</a> (ssh) into it, then open a <a href="https://github.com/tmux/tmux">tmux</a> and <a href="https://neovim.io/">neovim</a>, and work there, so that I can use any (lightweight) laptop while remotely running everything in the powerful-enough server.
150Another point for using vim/neovim as default code editor, is that when working remotely on a server, the setup remains the same. Another perspective is that you treat your laptop as a server for those kinds of tasks, so that when you work remotely on a server there is almost no difference.
151<div style="text-align:center;">
152<a target="_blank" href="img/posts/tools/server.jpg"><img style="width:60%" src="img/posts/tools/server.jpg"></img></a>
153</div></li>
154</ul></li>
155<li>Outside home:
156
157<ul>
158<li>for many years I used a Thinkpad x270 of 12.5&rdquo; screen, then a Thinkpad Carbon X1 of 13&rdquo;, but then few years ago I started using smaller laptops of 10&rdquo;</li>
159<li>10&rdquo; laptop: I was using a 2nd hand <a href="https://support.microsoft.com/en-us/surface/surface-go-2-specs-and-features-0fc6a657-2851-484f-6f82-bd3c589ed92c">Surface Go 2</a> that I bought for 200 euros, but recently I&rsquo;ve replaced it with a <a href="https://www.chuwi.com/product/items/chuwi-minibook-x-n150.html">Chuwi Minibook X</a> which costs 300 euros (brand new). Both laptops have 10&rdquo;.</li>
160<li>8&rdquo; tablet + notebook; or if in the sun, instead of the tablet, a eink reader (if so, a <a href="https://koreader.rocks">hacked one</a>)</li>
161</ul></li>
162</ul>
163
164<div style="text-align:center;">
165<a target="_blank" href="img/posts/tools/big-slingbag-contents.jpg"><img style="width:60%;" src="img/posts/tools/big-slingbag-contents.jpg"></img></a>
166<br>
167<i style="font-size:75%">8" tablet and 10" laptop</i>
168</div>
169
170<p>A benefit of using lightweight laptops combined with a remote <em>powerful</em> server, is that the battery lasts longer than doing everything in the laptop, since you&rsquo;re not doing many computations locally in the laptop!</p>
171
172<h2>services</h2>
173
174<p>Useful to have some raspberrypi/minipc at home with some services to make your life more comfortable (for example, with: <a href="https://github.com/arnaucube/configs/blob/master/server-dockers/docker-compose.yml">docker compose configuration file</a>).</p>
175
176<p>For about 2 years I&rsquo;ve been running multiple media services in a raspberry pi 5, recently replaced it with a Beelink S13 NUC, where I can support many users of non-technical friends.
177<div style="text-align:center;">
178<a target="_blank" href="img/posts/tools/media-setup.png"><img style="width:80%;" src="img/posts/tools/media-setup.png"></img></a>
179</div></p>
180
181<p>Useful services:</p>
182
183<ul>
184<li><a href="https://github.com/qbittorrent/qBittorrent">qbittorrent-nox</a>: the server version of qbittorrent, managed through a web UI</li>
185<li><a href="https://jellyfin.org/">Jellyfin</a>: stream all the downloaded content (shows, movies, music) to your devices (tv, tablet, phone, laptop, etc)</li>
186<li><a href="https://github.com/slskd/slskd/">slskd</a>: server client for the <a href="https://en.wikipedia.org/wiki/Soulseek">Soulseek network</a>, in order to download individual songs or albums that are not found through torrent</li>
187</ul>
188
189<p>Highly recommended: with the previous services, you have all the minimal setup to enjoy media at home; but there is more dimension to it; the various projects within the *arr family, eg:
190<a href="https://sonarr.tv/">sonarr</a>, <a href="https://radarr.video/">radarr</a>, <a href="https://www.bazarr.media/">bazarr</a>, <a href="https://prowlarr.com/">prawlarr</a>, etc.</p>
191
192<p>Then you can tie all those services through a main page with <a href="https://gethomepage.dev">homepage</a>, so that all links are accessible with a single click.</p>
193
194<p>Also, using browser <a href="https://github.com/gorhill/uBlock">adblockers</a> has become a must over the years, additionally having a <a href="https://pi-hole.net">pi-hole</a> connected to your router filters out adds in general on your home network (on all devices!), while also filtering out a big portion of trackers.</p>
195
196<h2>AFK / on the go</h2>
197
198<p><em>(AFK: away from keyboard, when I go outside of home)</em></p>
199
200<ul>
201<li>sometimes I bring a slim-foldable keyboard</li>
202<li>during the day (if I don&rsquo;t require a laptop): slingbag with
203
204<ul>
205<li>notebook and fountain pens</li>
206<li>eink reader (ie. hacked kindle) or a 8&rdquo; tablet</li>
207</ul></li>
208</ul>
209
210<div style="text-align:center;">
211<a target="_blank" href="img/posts/tools/small-slingbag-contents.jpg"><img style="width:60%;" src="img/posts/tools/small-slingbag-contents.jpg"></img></a>
212</div>
213
214<p><br>
215<div style="text-align:center;">
216<a target="_blank" href="img/posts/tools/notebook-kindle-outside.jpg"><img style="width:60%" src="img/posts/tools/notebook-kindle-outside.jpg"></img></a>
217    <br>
218    <i style="font-size:75%">can just randomly pop out of home and just sit anywhere to keep studying</i>
219</div></p>
220
221<ul>
222<li>travel: <a href="https://www.patagonia.com/product/refugio-daypack-30-liters/47928.html">30L backpack</a> with
223
224<ul>
225<li><a href="#pens-and notebooks">notebook</a></li>
226<li>eink reader / tablet 8&rdquo;</li>
227<li>laptop (see <a href="#devices">laptop</a> section)</li>
228<li>clothes for 7 days, on the 6th day you do laundry, so you can travel long periods of time, virtually indefinite</li>
229</ul></li>
230</ul>
231
232<div style="text-align:center;">
233<a target="_blank" href="img/posts/tools/backpack.jpg"><img style="width:80%;" src="img/posts/tools/backpack.jpg"></img></a>
234</div>
235
236<p>With this backpack setup I&rsquo;ve traveled across the world (6 continents), with stays ranging from few days to 2 months, all with same backpack setup.</p>
237
238<p><br></p>
239
240<p>Notes about the picture above: this picture is from &gt;2 years ago, some changes I did since then:</p>
241
242<ul>
243<li>laptop: the Surface Go 2 has been replaced by the Chuwi Minibook X (both of 10&rdquo;), see <a href="#devices">laptop</a> section for more details</li>
244<li>tablet: the 10&rdquo; tablet has been replaced by a 8&rdquo; tablet</li>
245<li>emulator: the <a href="https://www.goretroid.com/products/retroid-pocket-4-handheld">Retroid Pocket 4 Pro</a> has been replaced by the <a href="https://retrogamecorps.com/2022/05/15/miyoo-mini-v2-guide/">Myioo Mini Plus</a> (less powerful, so less console options, but smaller in the backpack; ideal for GBA games!)</li>
246</ul>
247
248<h3>pens and notebooks</h3>
249
250<p>In the recent years I&rsquo;ve discovered the joy of using <a href="https://www.reddit.com/r/fountainpens">fountain pens</a>. They are not essential, but is one of those little joys of life.</p>
251
252<p>I&rsquo;ve had the opportunity to try many different models, both from buying some of them and also from trying them in-store (in Seoul there is <a href="https://maps.app.goo.gl/quDc2oAfb8Kn6Rug7">a very nice shop</a> where for a small fee you have all the time you need to roam through the shop trying more than 200 pens!)</p>
253
254<div style="text-align:center;">
255<a target="_blank" href="img/posts/tools/penshop-bestpen.png"><img style="width:80%;" src="img/posts/tools/penshop-bestpen.png"></img></a>
256    <br>
257    <i style="font-size:75%">In purple t-shirt, enjoying 2h of trying many many pens at <a href="https://maps.app.goo.gl/quDc2oAfb8Kn6Rug7" target="_blank">BestPen</a>, Seoul (South Korea).</i>
258</div>
259
260<p>Beware, once you enter the fountain pens rabbit hole, the next worry is the paper, hence a natural following fixation are the notebooks to use with the fountain pens. Not all papers are good enough for fountain pens, but there are <a href="https://md-product.com/en/collections/md-notebook">some</a> very <a href="https://www.clairefontaine.com/gb/3525-10811-carnet-brochure-age-bag-795401c.html#/1182-rulings-o_uni/1756-dimension-145_x_21_cm/1971-couleur_produit-gris">good</a> paper <a href="https://www.youtube.com/watch?v=c_UvVavl-eE">quality</a> notebooks. Similarly inks are another <a href="https://mountainofink.com">rabbit hole</a>.</p>
261
262<div style="text-align:center;">
263<a target="_blank" href="img/notebooks.jpg"><img style="width:80%;" src="img/notebooks.jpg"></img></a>
264</div>
265
266    </div>
267
268    <footer style="text-align:center; margin-top:100px;margin-bottom:50px;">
269      <div class="container">
270        <br>
271        <a href="/blog">Go to main</a>
272        <br><br>
273        <div class="row">
274          <ul class="list-inline">
275            <li><a href="https://twitter.com/arnaucube"
276                   style="color:gray;text-decoration:none;"
277                   target="_blank">twitter.com/arnaucube</a>
278            </li>
279            <li><a href="https://github.com/arnaucube"
280                   style="color:gray;text-decoration:none;"
281                   target="_blank">github.com/arnaucube</a>
282            </li>
283          </ul>
284        </div>
285        <div class="row" style="display:inline-block;">
286          Blog made with <a href="http://github.com/arnaucube/blogo/"
287                            target="_blank" style="color: gray;text-decoration:none;">Blogo</a>
288        </div>
289      </div>
290    </footer>
291
292    <script>
293    </script>
294    <script src="js/external-links.js"></script>
295    <script>hljs.initHighlightingOnLoad();</script>
296    <script defer src="js/katex/katex.min.js"></script>
297    <script defer src="js/katex/auto-render.min.js"></script>
298    <script>
299      document.addEventListener("DOMContentLoaded", function() {
300        renderMathInElement(document.body, {
301          displayMode: false,
302          // customised options
303          // • auto-render specific keys, e.g.:
304          delimiters: [
305            {left: '$$', right: '$$', display: true},
306            {left: '$', right: '$', display: false},
307            {left: "\\[", right: "\\]", display: true},
308            {left: "\\(", right: "\\)", display: false},
309            {left: "\\begin{equation}", right: "\\end{equation}", display: true}
310          ],
311          // • rendering keys, e.g.:
312          throwOnError : true
313        });
314      });
315
316      ///
317      let theme = localStorage.getItem("theme");
318      if ((theme === "light-theme")||(theme==null)) {
319          theme = "light-theme";
320          document.getElementById("themeSwitcher").checked = false;
321      } else if (theme === "dark-theme") {
322          theme = "dark-theme";
323          document.getElementById("themeSwitcher").checked = true;
324      }
325      document.body.className = theme;
326      localStorage.setItem("theme", theme);
327
328      function switchTheme() {
329        theme = localStorage.getItem("theme");
330        if (theme === "light-theme") {
331          theme = "dark-theme";
332          document.getElementById("themeSwitcher").checked = true;
333        } else {
334          theme = "light-theme";
335          document.getElementById("themeSwitcher").checked = false;
336        }
337        document.body.className = theme;
338        localStorage.setItem("theme", theme);
339
340        console.log(theme);
341      }
342    </script>
343    <script>
344    function tagLinks(tagName) {
345      var tags = document.getElementsByTagName(tagName);
346      for (var i=0, hElem; hElem =  tags[i]; i++) {
347        if (hElem.parentNode.className=="row postThumb") {
348          continue;
349        }
350        hElem.id = hElem.innerHTML.toLowerCase().replace(" ", "-");
351        hElem.innerHTML = "<a style='color:black!important;' href='#"+hElem.id+"'>"+hElem.innerHTML+"</a>";
352      }
353    }
354    tagLinks("h2");
355    tagLinks("h3");
356    tagLinks("h4");
357    tagLinks("h5");
358    </script>
359    <script>
360function generateTOC(tocContainerId = "toc") {
361    const tocContainer = document.getElementById(tocContainerId);
362    if (!tocContainer) return;
363
364    const headings = document.querySelectorAll("h2, h3, h4, h5, h6");
365    if (!headings.length) return;
366
367    // Generate IDs if missing
368    headings.forEach((heading, index) => {
369        if (!heading.id) {
370            heading.id =
371                heading.textContent
372                    .trim()
373                    .toLowerCase()
374                    .replace(/[^\w\s-]/g, "")
375                    .replace(/\s+/g, "-") +
376                "-" +
377                index;
378        }
379    });
380
381    const toc = document.createElement("ul");
382    let currentLevel = 1;
383    let currentList = toc;
384    const stack = [toc];
385
386    headings.forEach((heading) => {
387        const level = parseInt(heading.tagName.substring(1), 10);
388
389        const li = document.createElement("li");
390        const a = document.createElement("a");
391
392        a.href = "#" + heading.id;
393        a.textContent = heading.textContent;
394
395        li.appendChild(a);
396
397        if (level > currentLevel) {
398            for (let i = currentLevel; i < level; i++) {
399                const nestedList = document.createElement("ul");
400
401                const lastLi =
402                    currentList.lastElementChild ||
403                    currentList.appendChild(document.createElement("ul"));
404
405                lastLi.appendChild(nestedList);
406
407                stack.push(nestedList);
408                currentList = nestedList;
409            }
410        } else if (level < currentLevel) {
411            for (let i = currentLevel; i > level; i--) {
412                stack.pop();
413            }
414            currentList = stack[stack.length - 1];
415        }
416
417        currentList.appendChild(li);
418        currentLevel = level;
419    });
420
421    tocContainer.innerHTML = "";
422    tocContainer.appendChild(toc);
423}
424
425document.addEventListener("DOMContentLoaded", () => {
426    generateTOC();
427});
428    </script>
429    <script src="js/mermaid.min.js"></script>
430
431  </body>
432</html>
433