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  </head>
 38
 39  <body>
 40
 41    <!-- o_gradient_background" -->
 42    <nav id="mainNav" class="navbar navbar-default navbar-fixed-top"
 43                      style="height:50px;font-size:100%;">
 44      <div class="container">
 45        <div style="float:left;">
 46        <a href="/blog" style="color:#000;display:inline-block;">blog</a>
 47        <span style="margin-right:20px; margin-left:20px;">|</span>
 48        <a href="/blog/notes.html" style="font-size:90%;color:#000;display:inline-block;">notes</a>
 49        </div>
 50        <div style="float:right;">
 51          <a href="/" style="color:#000;display:inline-block;margin-right:10px;">arnaucube.com</a>
 52          <div class="onoffswitch" style="margin-left:0px;display:inline-block;" title="change theme">
 53            <input onclick="switchTheme()" type="checkbox" name="onoffswitch" class="onoffswitch-checkbox"
 54              id="themeSwitcher">
 55            <label class="onoffswitch-label" for="themeSwitcher"></label>
 56          </div>
 57        </div>
 58      </div>
 59      <!-- <img style="height:5px; width:100%; margin-top:8px;" src="img/gradient-line.jpg" /> -->
 60    </nav>
 61
 62
 63
 64    <div class="container" style="margin-top:0px;max-width:800px;">
 65      <h1>Tools</h1>
 66
 67<p><em>2026-06-08</em></p>
 68
 69<p>A non-exhaustive overview of tools I use daily.</p>
 70
 71<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>
 72
 73<h2>in general</h2>
 74
 75<ul>
 76<li>Always be willing to <strong>customize and optimmize</strong> the tools you use</li>
 77<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>
 78<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>
 79<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>
 80<li>prefer offline tools than online tools</li>
 81<li>In physical objects optimize for <strong>portability</strong>; also usually is good to not centralize many functions in a single object</li>
 82</ul>
 83
 84<h2>computer</h2>
 85
 86<ul>
 87<li>in general
 88
 89<ul>
 90<li>maximize keyboard shortcuts, and minimize keyboard surface
 91
 92<ul>
 93<li>I use a <strong>40% keyboard, <a href="https://github.com/foostan/crkbd">corne</a></strong> keyboard</li>
 94<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)
 95<div style="text-align:center;">
 96<a target="_blank" href="img/posts/tools/corne.png"><img style="width:60%" src="img/posts/tools/corne.png"></img></a>
 97<br>
 98<i style="font-size:75%">the Corne keyboard I use, self-assembled and soldered</i>
 99</div></li>
100</ul></li>
101<li><strong>minimize mouse</strong> usage:
102
103<ul>
104<li>using the mouse means lifting the fingers from the keyboard</li>
105<li>mouse limits an entire hand to only click buttons, you have many more fingers to use</li>
106<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
107
108<ul>
109<li>also this has the benefit that working in my laptop or working in the server feels the same</li>
110</ul></li>
111<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>
112</ul></li>
113<li>automate:
114
115<ul>
116<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>
117<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>
118</ul></li>
119</ul></li>
120</ul>
121
122<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.
123Similarly, 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>
124
125<div style="text-align:center;">
126<a target="_blank" href="img/posts/tools/desk-setup.jpg"><img style="width:75%" src="img/posts/tools/desk-setup.jpg"></img></a>
127<br>
128<i style="font-size:75%">a bit old (~2023) desk setup, with my 'old' Thinkpad Carbon X1</i>
129</div>
130
131<h4>devices</h4>
132
133<!-- TODO picture corne + screens -->
134
135<ul>
136<li>At home:
137
138<ul>
139<li>I build a ~850 euros server (year 2024), with AMD Ryzen 9 5900XT 3.3 GHz 16-Core, 64 GB of RAM.</li>
140<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.
141Another 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.
142<div style="text-align:center;">
143<a target="_blank" href="img/posts/tools/server.jpg"><img style="width:60%" src="img/posts/tools/server.jpg"></img></a>
144</div></li>
145</ul></li>
146<li>Outside home:
147
148<ul>
149<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>
150<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>
151<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>
152</ul></li>
153</ul>
154
155<div style="text-align:center;">
156<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>
157<br>
158<i style="font-size:75%">8" tablet and 10" laptop</i>
159</div>
160
161<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>
162
163<h2>services</h2>
164
165<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>
166
167<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.
168<div style="text-align:center;">
169<a target="_blank" href="img/posts/tools/media-setup.png"><img style="width:80%;" src="img/posts/tools/media-setup.png"></img></a>
170</div></p>
171
172<p>Useful services:</p>
173
174<ul>
175<li><a href="https://github.com/qbittorrent/qBittorrent">qbittorrent-nox</a>: the server version of qbittorrent, managed through a web UI</li>
176<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>
177<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>
178</ul>
179
180<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:
181<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>
182
183<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>
184
185<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>
186
187<h2>AFK / on the go</h2>
188
189<p><em>(AFK: away from keyboard, when I go outside of home)</em></p>
190
191<ul>
192<li>sometimes I bring a slim-foldable keyboard</li>
193<li>during the day (if I don&rsquo;t require a laptop): slingbag with
194
195<ul>
196<li>notebook and fountain pens</li>
197<li>eink reader (ie. hacked kindle) or a 8&rdquo; tablet</li>
198</ul></li>
199</ul>
200
201<div style="text-align:center;">
202<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>
203</div>
204
205<p><br>
206<div style="text-align:center;">
207<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>
208    <br>
209    <i style="font-size:75%">can just randomly pop out of home and just sit anywhere to keep studying</i>
210</div></p>
211
212<ul>
213<li>travel: <a href="https://www.patagonia.com/product/refugio-daypack-30-liters/47928.html">30L backpack</a> with
214
215<ul>
216<li><a href="#pens-and notebooks">notebook</a></li>
217<li>eink reader / tablet 8&rdquo;</li>
218<li>laptop (see <a href="#devices">laptop</a> section)</li>
219<li>clothes for 7 days, on the 6th day you do laundry, so you can travel long periods of time, virtually indefinite</li>
220</ul></li>
221</ul>
222
223<div style="text-align:center;">
224<a target="_blank" href="img/posts/tools/backpack.jpg"><img style="width:80%;" src="img/posts/tools/backpack.jpg"></img></a>
225</div>
226
227<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>
228
229<p><br></p>
230
231<p>Notes about the picture above: this picture is from &gt;2 years ago, some changes I did since then:</p>
232
233<ul>
234<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>
235<li>tablet: the 10&rdquo; tablet has been replaced by a 8&rdquo; tablet</li>
236<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>
237</ul>
238
239<h3>pens and notebooks</h3>
240
241<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>
242
243<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>
244
245<div style="text-align:center;">
246<a target="_blank" href="img/posts/tools/penshop-bestpen.png"><img style="width:80%;" src="img/posts/tools/penshop-bestpen.png"></img></a>
247    <br>
248    <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>
249</div>
250
251<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>
252
253<div style="text-align:center;">
254<a target="_blank" href="img/notebooks.jpg"><img style="width:80%;" src="img/notebooks.jpg"></img></a>
255</div>
256
257    </div>
258
259    <footer style="text-align:center; margin-top:100px;margin-bottom:50px;">
260      <div class="container">
261        <br>
262        <a href="/blog">Go to main</a>
263        <br><br>
264        <div class="row">
265          <ul class="list-inline">
266            <li><a href="https://twitter.com/arnaucube"
267                   style="color:gray;text-decoration:none;"
268                   target="_blank">twitter.com/arnaucube</a>
269            </li>
270            <li><a href="https://github.com/arnaucube"
271                   style="color:gray;text-decoration:none;"
272                   target="_blank">github.com/arnaucube</a>
273            </li>
274          </ul>
275        </div>
276        <div class="row" style="display:inline-block;">
277          Blog made with <a href="http://github.com/arnaucube/blogo/"
278                            target="_blank" style="color: gray;text-decoration:none;">Blogo</a>
279        </div>
280      </div>
281    </footer>
282
283    <script>
284    </script>
285    <script src="js/external-links.js"></script>
286    <script>hljs.initHighlightingOnLoad();</script>
287    <script defer src="js/katex/katex.min.js"></script>
288    <script defer src="js/katex/auto-render.min.js"></script>
289    <script>
290      document.addEventListener("DOMContentLoaded", function() {
291        renderMathInElement(document.body, {
292          displayMode: false,
293          // customised options
294          // • auto-render specific keys, e.g.:
295          delimiters: [
296            {left: '$$', right: '$$', display: true},
297            {left: '$', right: '$', display: false},
298            {left: "\\[", right: "\\]", display: true},
299            {left: "\\(", right: "\\)", display: false},
300            {left: "\\begin{equation}", right: "\\end{equation}", display: true}
301          ],
302          // • rendering keys, e.g.:
303          throwOnError : true
304        });
305      });
306
307      ///
308      let theme = localStorage.getItem("theme");
309      if ((theme === "light-theme")||(theme==null)) {
310          theme = "light-theme";
311          document.getElementById("themeSwitcher").checked = false;
312      } else if (theme === "dark-theme") {
313          theme = "dark-theme";
314          document.getElementById("themeSwitcher").checked = true;
315      }
316      document.body.className = theme;
317      localStorage.setItem("theme", theme);
318
319      function switchTheme() {
320        theme = localStorage.getItem("theme");
321        if (theme === "light-theme") {
322          theme = "dark-theme";
323          document.getElementById("themeSwitcher").checked = true;
324        } else {
325          theme = "light-theme";
326          document.getElementById("themeSwitcher").checked = false;
327        }
328        document.body.className = theme;
329        localStorage.setItem("theme", theme);
330
331        console.log(theme);
332      }
333    </script>
334    <script>
335    function tagLinks(tagName) {
336      var tags = document.getElementsByTagName(tagName);
337      for (var i=0, hElem; hElem =  tags[i]; i++) {
338        if (hElem.parentNode.className=="row postThumb") {
339          continue;
340        }
341        hElem.id = hElem.innerHTML.toLowerCase().replace(" ", "-");
342        hElem.innerHTML = "<a style='color:black!important;' href='#"+hElem.id+"'>"+hElem.innerHTML+"</a>";
343      }
344    }
345    tagLinks("h2");
346    tagLinks("h3");
347    tagLinks("h4");
348    tagLinks("h5");
349    </script>
350    <script>
351function generateTOC(tocContainerId = "toc") {
352    const tocContainer = document.getElementById(tocContainerId);
353    if (!tocContainer) return;
354
355    const headings = document.querySelectorAll("h2, h3, h4, h5, h6");
356    if (!headings.length) return;
357
358    // Generate IDs if missing
359    headings.forEach((heading, index) => {
360        if (!heading.id) {
361            heading.id =
362                heading.textContent
363                    .trim()
364                    .toLowerCase()
365                    .replace(/[^\w\s-]/g, "")
366                    .replace(/\s+/g, "-") +
367                "-" +
368                index;
369        }
370    });
371
372    const toc = document.createElement("ul");
373    let currentLevel = 1;
374    let currentList = toc;
375    const stack = [toc];
376
377    headings.forEach((heading) => {
378        const level = parseInt(heading.tagName.substring(1), 10);
379
380        const li = document.createElement("li");
381        const a = document.createElement("a");
382
383        a.href = "#" + heading.id;
384        a.textContent = heading.textContent;
385
386        li.appendChild(a);
387
388        if (level > currentLevel) {
389            for (let i = currentLevel; i < level; i++) {
390                const nestedList = document.createElement("ul");
391
392                const lastLi =
393                    currentList.lastElementChild ||
394                    currentList.appendChild(document.createElement("ul"));
395
396                lastLi.appendChild(nestedList);
397
398                stack.push(nestedList);
399                currentList = nestedList;
400            }
401        } else if (level < currentLevel) {
402            for (let i = currentLevel; i > level; i--) {
403                stack.pop();
404            }
405            currentList = stack[stack.length - 1];
406        }
407
408        currentList.appendChild(li);
409        currentLevel = level;
410    });
411
412    tocContainer.innerHTML = "";
413    tocContainer.appendChild(toc);
414}
415
416document.addEventListener("DOMContentLoaded", () => {
417    generateTOC();
418});
419    </script>
420    <script src="js/mermaid.min.js"></script>
421
422  </body>
423</html>
424