<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Productivity on Jon Seager</title><link>https://jnsgr.uk/tags/productivity/</link><description>Recent content in Productivity on Jon Seager</description><generator>Hugo -- gohugo.io</generator><language>en</language><lastBuildDate>Mon, 30 Jun 2025 00:00:00 +0000</lastBuildDate><atom:link href="https://jnsgr.uk/tags/productivity/index.xml" rel="self" type="application/rss+xml"/><item><title>Introducing Debcrafters</title><link>https://jnsgr.uk/2025/06/introducing-debcrafters/</link><pubDate>Mon, 30 Jun 2025 00:00:00 +0000</pubDate><guid>https://jnsgr.uk/2025/06/introducing-debcrafters/</guid><description>&lt;blockquote&gt;
&lt;p&gt;This article was originally posted &lt;a href="https://discourse.ubuntu.com/t/63674" target="_blank" rel="noreferrer"&gt;on the Ubuntu Discourse&lt;/a&gt;, and is reposted here. I welcome comments and further discussion in that thread.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Earlier this year, Canonical&amp;rsquo;s Ubuntu Engineering organisation gained a new team, seeded with some of our most prolific contributors to Ubuntu. Debcrafters is a new team dedicated to the maintenance of the Ubuntu Archive.&lt;/p&gt;
&lt;p&gt;The team&amp;rsquo;s primary goal is to maintain the health of the Ubuntu Archive, but its unique construction aims to attract a broad range of Linux distribution expertise; contributors to distributions like Debian, Arch Linux, NixOS and others are encouraged to join the team, and will even get paid to contribute one day per week to those projects to foster learning and idea sharing&lt;/p&gt;
&lt;h3 id="bootstrapping-the-team" class="relative group"&gt;Bootstrapping the team &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="#bootstrapping-the-team" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h3&gt;&lt;p&gt;The Debcrafters team is a global team. We have a squad in the Americas, a squad in EMEA and will have a squad in APAC. At present, we&amp;rsquo;ve staffed the AMER and EMEA teams with existing Canonical employees from our Foundations, Desktop, Server and Public Cloud teams. Each team currently has a manager, and four engineers.&lt;/p&gt;
&lt;p&gt;The team comprises Debian Developers, Stable Release Updates (SRU) team members and archive administrators, and began working together for the first time at our recent Engineering Sprint in Frankfurt held in early May 2025.&lt;/p&gt;
&lt;h3 id="mission" class="relative group"&gt;Mission &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="#mission" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h3&gt;&lt;p&gt;The Debcrafters&amp;rsquo; primary mission is to maintain the health of the Ubuntu Archive.&lt;/p&gt;
&lt;p&gt;This team will take the lead on syncing &amp;amp; merging packages from Debian, reviewing proposed migration issues, upstreaming Ubuntu deltas, and take ownership of major transitions such as upgrades to &lt;code&gt;glibc&lt;/code&gt; and past examples such as the &lt;code&gt;t64&lt;/code&gt; and &lt;code&gt;python3&lt;/code&gt; transitions.&lt;/p&gt;
&lt;p&gt;They&amp;rsquo;ll manage the scheduling, triggering and reporting on archive test rebuilds which we conduct when making major changes to critical packages. We did this when we enabled frame pointers by default, and when we switched &lt;code&gt;coreutils&lt;/code&gt; to the &lt;code&gt;uutils&lt;/code&gt; implementation in Ubuntu 25.10.&lt;/p&gt;
&lt;p&gt;They&amp;rsquo;ll be responsible for the evolution and maintenance of the &lt;code&gt;autopkgtest&lt;/code&gt; infrastructure for Ubuntu, as well as taking an instrumental role in introducing more distro-scale integration tests.&lt;/p&gt;
&lt;p&gt;They&amp;rsquo;ll work on improving the reporting and dashboarding of the Ubuntu Archive, its contributors and status, as well as taking a broader interest in shaping the tools we use to build and shape Ubuntu.&lt;/p&gt;
&lt;p&gt;What sets this team apart from the likes of Desktop, Server and Foundations is the range of packages they will work on. Members of the Debcrafters team will move thousands of packages every cycle - many of which they will not be intimately familiar with, but will use their growing distro maintenance and packaging skills to perform maintenance where there is no other clear or present owner.&lt;/p&gt;
&lt;h3 id="tools--processes" class="relative group"&gt;Tools &amp;amp; processes &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--processes" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h3&gt;&lt;p&gt;One of the key goals in my first &lt;a href="https://jnsgr.uk/2025/02/engineering-ubuntu-for-the-next-20-years/" target="_blank" rel="noreferrer"&gt;post&lt;/a&gt; was to modernise the contribution experience for Ubuntu Developers by focusing on tools and processes.&lt;/p&gt;
&lt;p&gt;The Debian project recently adopted &lt;a href="https://wiki.debian.org/tag2upload" target="_blank" rel="noreferrer"&gt;tag2upload&lt;/a&gt;, which allows Debian Developers to use &lt;a href="https://packages.debian.org/search?keywords=git-debpush" target="_blank" rel="noreferrer"&gt;git-debpush&lt;/a&gt; to push a signed &lt;code&gt;git&lt;/code&gt; tag when uploading packages. While we’re not following that exact path, we share many of the same goals and intentions.&lt;/p&gt;
&lt;p&gt;For some time Ubuntu Developers have been able to use &lt;a href="https://canonical-git-ubuntu.readthedocs-hosted.com/en/latest/" target="_blank" rel="noreferrer"&gt;&lt;code&gt;git-ubuntu&lt;/code&gt;&lt;/a&gt; as part of their development workflow, which aims to provide &amp;ldquo;unified git-based workflows for the development of Ubuntu source packages&amp;rdquo;. This project brought us closer to our desired experience, but still needs work to achieve our complete vision. I&amp;rsquo;d like to put more emphasis on the experience we provide for &lt;em&gt;testing&lt;/em&gt; packages, as well as signing, uploading and releasing packages.&lt;/p&gt;
&lt;p&gt;In the coming weeks our Starcraft team (responsible for &lt;a href="https://github.com/canonical/snapcraft" target="_blank" rel="noreferrer"&gt;Snapcraft&lt;/a&gt;, &lt;a href="https://github.com/canonical/rockcraft" target="_blank" rel="noreferrer"&gt;Rockcraft&lt;/a&gt;, &lt;a href="https://github.com/canonical/charmcraft" target="_blank" rel="noreferrer"&gt;Charmcraft&lt;/a&gt;) will begin prototyping &lt;code&gt;debcraft&lt;/code&gt;, which will (in time) become the de facto method for creating, testing and uploading packages to the Ubuntu archive.&lt;/p&gt;
&lt;p&gt;The first prototype of &lt;code&gt;debcraft&lt;/code&gt; will focus on unifying the current workflow adopted by most Ubuntu Developers at Canonical. It will wrap existing tools (such as &lt;code&gt;git-ubuntu&lt;/code&gt;, &lt;code&gt;lintian&lt;/code&gt;, &lt;code&gt;autopkgtest&lt;/code&gt;) to provide familiar, streamlined commands such as &lt;code&gt;debcraft pack&lt;/code&gt;, &lt;code&gt;debcraft lint&lt;/code&gt; and &lt;code&gt;debcraft test&lt;/code&gt;. Uploading packages, and a more native &amp;ldquo;craft&amp;rdquo; experience for constructing packages will come later.&lt;/p&gt;
&lt;p&gt;Details will make their way into the new &lt;a href="https://canonical-ubuntu-project.readthedocs-hosted.com/" target="_blank" rel="noreferrer"&gt;Ubuntu Project Docs&lt;/a&gt; throughout the course of the 25.10 Questing Quokka cycle, including the newly renovated &amp;ldquo;Ubuntu Packaging Guide&amp;rdquo;, which will aim to provide a &amp;ldquo;one ring to rule them all&amp;rdquo; approach to documenting how to package software for Ubuntu.&lt;/p&gt;
&lt;h3 id="attracting-contributors" class="relative group"&gt;Attracting contributors &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="#attracting-contributors" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h3&gt;&lt;p&gt;While the team has been seeded with seasoned Ubuntu contributors, one of the primary goals of the team is to grow the contributor base across generations.&lt;/p&gt;
&lt;p&gt;One of the sub-teams is currently leading the roll out of a new contributor journey that will soon be publicly available. This process lays out the journey from complete beginner to &amp;ldquo;Core Dev&amp;rdquo;, stopping off at &amp;ldquo;Package Maintainer&amp;rdquo;, &amp;ldquo;Package Set Maintainer&amp;rdquo;, &amp;ldquo;&lt;a href="https://canonical-ubuntu-project.readthedocs-hosted.com/reference/glossary/#term-MOTU" target="_blank" rel="noreferrer"&gt;MOTU&lt;/a&gt;&amp;rdquo;, etc. along the way. The process also aims to help candidates prepare for Developer Membership Board interviews.&lt;/p&gt;
&lt;p&gt;Whether you&amp;rsquo;re a junior engineer just graduating from University, or you&amp;rsquo;re a seasoned Linux contributor elsewhere in the Linux ecosystem, the Debcrafters team is an excellent place to learn software packaging skills and contribute to the world&amp;rsquo;s most deployed Linux distribution.&lt;/p&gt;
&lt;h3 id="contribution-beyond-ubuntu" class="relative group"&gt;Contribution beyond Ubuntu &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="#contribution-beyond-ubuntu" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h3&gt;&lt;p&gt;The Debcrafters&amp;rsquo; primary commitment is to Ubuntu, but we recognise the enormous value in collaborating with other distributions. Many of the hard lessons I&amp;rsquo;ve personally learned resulted from contributing to NixOS and building Snaps. Packaging is a complex and ever-changing discipline, and other distributions are facing many of the complex problems we are - often with different or novel approaches to solving them.&lt;/p&gt;
&lt;p&gt;In recognition of this, we&amp;rsquo;re actively seeking maintainers from other distributions - be that Debian, Arch, NixOS, Guix, Fedora, Universal Blue or any other - packaging and distribution engineering skills are often common across distributions, and we believe that Ubuntu can benefit from broader perspectives, while contributing back to the wider ecosystem of distributions in the process.&lt;/p&gt;
&lt;p&gt;The Debcrafters must spend the majority of their work time on Ubuntu, but they will be encouraged to spend a day per week contributing to other distributions to gain understanding, and bring fresh perspectives to Ubuntu (and the reverse, hopefully!). This will be structured as a &lt;em&gt;literal&lt;/em&gt; day per week, agreed with the team management - for example &amp;ldquo;I work on NixOS on Tuesdays&amp;rdquo;.&lt;/p&gt;
&lt;h3 id="summary" class="relative group"&gt;Summary &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="#summary" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h3&gt;&lt;p&gt;Canonical has launched a new team, the Debcrafters, who are dedicated to maintaining the very core of Ubuntu: the archive. This team has a global footprint, and deep expertise in software packaging drawn from across the Linux ecosystem. They&amp;rsquo;ll lead transitions, improve tooling improvements and strengthen our distribution testing infrastructure.&lt;/p&gt;
&lt;p&gt;Whether you&amp;rsquo;re an experienced Debian Developer, a maintainer from another Linux distribution or a new engineer starting your career in open source, Debcrafters offers a unique opportunity to learn, grow, and contribute to the world’s most widely deployed Linux distribution.&lt;/p&gt;</description></item><item><title>From NixOS to Ubuntu</title><link>https://jnsgr.uk/2025/06/from-nixos-to-ubuntu/</link><pubDate>Tue, 24 Jun 2025 00:00:00 +0000</pubDate><guid>https://jnsgr.uk/2025/06/from-nixos-to-ubuntu/</guid><description>&lt;p&gt;Following my appointment as VP Engineering for Ubuntu, I moved all of my machines from NixOS to Ubuntu. Being responsible for decisions that affect millions of Ubuntu users comes with, in my opinion, the obligation to &lt;em&gt;use&lt;/em&gt; the product and live with those decisions myself.&lt;/p&gt;
&lt;p&gt;Following years of running Arch Linux and NixOS, I imagined this would be uncomfortable, but was pleasantly surprised. In this post, I&amp;rsquo;ll outline my setup and a new philosophy for how I configure my machines.&lt;/p&gt;
&lt;p&gt;Last year, I wrote &lt;a href="https://jnsgr.uk/2024/07/how-i-computer-in-2024/" target="_blank" rel="noreferrer"&gt;in detail&lt;/a&gt; about my setup. Consider this post a &amp;ldquo;diff&amp;rdquo; on what&amp;rsquo;s changed since.&lt;/p&gt;
&lt;h2 id="recap-why-nixos" class="relative group"&gt;Recap: Why NixOS? &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="#recap-why-nixos" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;NixOS affords a seemingly endless selection of applications, desktop environments and when combined with &lt;a href="https://github.com/nix-community/home-manager" target="_blank" rel="noreferrer"&gt;Home Manager&lt;/a&gt; it provides a consistent way to manage the configuration of almost all aspects of a system.&lt;/p&gt;
&lt;p&gt;People have argued that this is overkill, and results in needlessly complex configurations that produce difficult to read error messages, and make a system more difficult to troubleshoot.&lt;/p&gt;
&lt;p&gt;While I had some troubles adopting NixOS, I consistently felt that the positives outweighed the negatives: I loved being able to overlay individual packages and tweak fundamentals of the system in a machine specific way. I also liked being able to trivially reuse configuration for app and hardware configuration across my machines in a single &lt;a href="https://github.com/jnsgruk/nixos-config" target="_blank" rel="noreferrer"&gt;flake&lt;/a&gt;, which remains (to my amazement) one of my most popular GitHub repositories.&lt;/p&gt;
&lt;p&gt;As I planned my move to Ubuntu, I decided to change the way I used my computer to avoid fighting my machine, and any feeling that I could be missing out on the &lt;del&gt;complexity&lt;/del&gt; flexibility I&amp;rsquo;d become so used to.&lt;/p&gt;
&lt;h2 id="adopting-jfui" class="relative group"&gt;Adopting &amp;ldquo;JFUI&amp;rdquo; &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="#adopting-jfui" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;The guiding principle for my new way of thinking is &lt;strong&gt;JFUI: Just F*cking Use It&lt;/strong&gt;!&lt;/p&gt;
&lt;p&gt;The primary motivation behind JFUI is to pick applications for which the defaults are close enough to my preferences, then use them with as little (or no) configuration as possible.&lt;/p&gt;
&lt;p&gt;By employing this principle, I should spend less of my time updating my configuration files as things change, and spend less time obsessing over every last theme detail for each application on my machine.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve spent years collecting &lt;a href="https://github.com/jnsgruk/dotfiles" target="_blank" rel="noreferrer"&gt;repositories full of dotfiles&lt;/a&gt;, which contains the ~2500 lines of configuration and scripts I used prior to moving to NixOS. As of today, the most recent commit in &lt;a href="https://github.com/jnsgruk/nixos-config" target="_blank" rel="noreferrer"&gt;my Nix flake&lt;/a&gt;, &lt;code&gt;cloc&lt;/code&gt; reports:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;---------------------------------------------------
Language files blank comment code
---------------------------------------------------
Nix 113 401 232 3666
Bourne Again Shell 3 25 30 95
Bourne Shell 1 17 0 83
Markdown 1 19 1 81
YAML 4 8 3 51
diff 1 1 7 6
---------------------------------------------------
SUM: 123 471 273 3982
---------------------------------------------------
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;And that seems like &lt;em&gt;a lot&lt;/em&gt; to me! Yet this number omits my Visual Studio Code configuration (a further 200 lines of JSON), various browser configurations, etc.&lt;/p&gt;
&lt;p&gt;So I challenged myself to set up my Ubuntu machines with as little configuration as possible and to choose apps with better defaults.&lt;/p&gt;
&lt;h2 id="desktop-environment" class="relative group"&gt;Desktop Environment &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="#desktop-environment" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;It&amp;rsquo;d been a long time since I&amp;rsquo;d used a computer regularly without a tiling window manager. I switched to &lt;a href="https://swaywm.org/" target="_blank" rel="noreferrer"&gt;sway&lt;/a&gt; in 2019, and to &lt;a href="https://hypr.land/" target="_blank" rel="noreferrer"&gt;Hyprland&lt;/a&gt; in 2023.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve built a lot of muscle memory by using a consistent keymap across both environments. I &lt;a href="https://jnsgr.uk/2024/07/how-i-computer-in-2024/" target="_blank" rel="noreferrer"&gt;use&lt;/a&gt; a 57&amp;quot; ultrawide monitor, and the idea of using it &lt;em&gt;without tiling&lt;/em&gt; seemed like total anarchy to me.&lt;/p&gt;
&lt;p&gt;But it didn&amp;rsquo;t take me long to adapt to using GNOME again. Despite abstaining from it for years, I&amp;rsquo;ve always appreciated the visual design of GNOME and often used their apps as part of my tiling experience (&lt;a href="https://apps.gnome.org/en-GB/Nautilus/" target="_blank" rel="noreferrer"&gt;Files&lt;/a&gt;, &lt;a href="https://apps.gnome.org/en-GB/Papers/" target="_blank" rel="noreferrer"&gt;Papers&lt;/a&gt;, &lt;a href="https://apps.gnome.org/en-GB/Loupe/" target="_blank" rel="noreferrer"&gt;Loupe&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;Features such as the keyring, light/dark mode switching worked for me under Sway/Hyprland, but it always required complex, fragile configuration. The out of the box experience for configuring WiFi networks and Bluetooth devices feels modern, and like a part of the OS, rather than a kit of parts. In my latter few months of running Hyprland, I struggled more with consistent theming and stability as Hyprland evolved separately from the themes and apps I liked.&lt;/p&gt;
&lt;p&gt;I don&amp;rsquo;t attribute any blame for this; it&amp;rsquo;s a natural side effect of combining lots of independent and often complex parts from across the Linux desktop ecosystem, and I was consciously running pre 1.0 software knowing there would be issues because I enjoyed the overall experience.&lt;/p&gt;
&lt;h3 id="gnome-extensions" class="relative group"&gt;GNOME Extensions &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="#gnome-extensions" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h3&gt;&lt;p&gt;This is the area where I violated JFUI the most, though some of it is temporary as I get further away from my existing workflow. I disable the Ubuntu dock, desktop icons, app indicators and Ubuntu tiling assistant. While the tiling assistant was a great step up on what came before it, it fell short of what I needed to manage windows on my large display.&lt;/p&gt;
&lt;p&gt;I took inspiration from &lt;a href="https://omakub.org/" target="_blank" rel="noreferrer"&gt;Omakub&lt;/a&gt;, which is where I discovered &lt;a href="https://extensions.gnome.org/extension/4548/tactile/" target="_blank" rel="noreferrer"&gt;Tactile&lt;/a&gt; - a GNOME extension for tiling windows to a custom on-screen grid using the keyboard. I&amp;rsquo;ve found this to be invaluable, and easily the best window management experience for GNOME. I&amp;rsquo;ve customised the grid to the following ratios (using &lt;code&gt;gsettings&lt;/code&gt; in a script):&lt;/p&gt;
&lt;p&gt;&lt;a href="01.png"&gt;
&lt;figure&gt;
&lt;picture
class="mx-auto my-0 rounded-md"
&gt;
&lt;source
srcset="https://jnsgr.uk/2025/06/from-nixos-to-ubuntu/01_hu_563a2ca534804b07.webp 330w,https://jnsgr.uk/2025/06/from-nixos-to-ubuntu/01_hu_a88883170768e81a.webp 660w
,https://jnsgr.uk/2025/06/from-nixos-to-ubuntu/01_hu_f9d64651fdeef908.webp 959w
,https://jnsgr.uk/2025/06/from-nixos-to-ubuntu/01_hu_f9d64651fdeef908.webp 959w
"
sizes="100vw"
type="image/webp"
/&gt;
&lt;img
width="959"
height="522"
class="mx-auto my-0 rounded-md"
alt="a screenshot of the tactile gnome extension configuration window"
loading="lazy" decoding="async"
src="https://jnsgr.uk/2025/06/from-nixos-to-ubuntu/01_hu_d63430834ff566c4.png" srcset="https://jnsgr.uk/2025/06/from-nixos-to-ubuntu/01_hu_ebdaf981cf8217b8.png 330w,https://jnsgr.uk/2025/06/from-nixos-to-ubuntu/01_hu_d63430834ff566c4.png 660w
,https://jnsgr.uk/2025/06/from-nixos-to-ubuntu/01.png 959w
,https://jnsgr.uk/2025/06/from-nixos-to-ubuntu/01.png 959w
"
sizes="100vw"
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve grown to like &lt;a href="https://extensions.gnome.org/extension/5090/space-bar/" target="_blank" rel="noreferrer"&gt;Space Bar&lt;/a&gt; - it provides desktop workspaces akin to those in Sway/Hyprland which enabled me to use the muscle memory I&amp;rsquo;d developed over years. As I&amp;rsquo;ve progressed, I think I &lt;em&gt;could&lt;/em&gt; live without Space Bar and use the native workspace features in GNOME, so I&amp;rsquo;ll experiment with that soon.&lt;/p&gt;
&lt;p&gt;The final two are somewhat simpler: &lt;a href="https://extensions.gnome.org/extension/6242/emoji-copy/" target="_blank" rel="noreferrer"&gt;Emoji Copy&lt;/a&gt; (mapped to &lt;code&gt;Super + E&lt;/code&gt;) and &lt;a href="https://extensions.gnome.org/extension/4839/clipboard-history/" target="_blank" rel="noreferrer"&gt;Clipboard History&lt;/a&gt; (mapped to &lt;code&gt;Super + V&lt;/code&gt;), functions that were previously enabled by &lt;a href="https://github.com/SimplyCEO/wofi" target="_blank" rel="noreferrer"&gt;&lt;code&gt;wofi&lt;/code&gt;&lt;/a&gt; with a couple of plugins and lots of configuration.&lt;/p&gt;
&lt;h2 id="editors" class="relative group"&gt;Editors &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="#editors" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;I spend a lot of time in an editor. As I wrote &lt;a href="https://jnsgr.uk/uses" target="_blank" rel="noreferrer"&gt;last year&lt;/a&gt;, I&amp;rsquo;ve been using &lt;code&gt;neovim&lt;/code&gt; and Visual Studio Code for some years. I never &amp;ldquo;managed&amp;rdquo; Visual Studio Code with NixOS because I always found their settings sync to be quite sufficient.&lt;/p&gt;
&lt;p&gt;My &lt;a href="https://github.com/jnsgruk/nixos-config/blob/aad045010b1ac61d271858dd5f4c2fa8dcb6e5d4/home/common/shell/vim.nix" target="_blank" rel="noreferrer"&gt;&lt;code&gt;nvim&lt;/code&gt; config&lt;/a&gt; wasn&amp;rsquo;t too complicated - though it is made to look simpler because Home Manager abstracts away the details of managing plugins. I hadn&amp;rsquo;t taken the time to set up language server support, code completion or other creature comforts that one might expect from an editor in 2025.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;d dabbled before with &lt;a href="https://helix-editor.com/" target="_blank" rel="noreferrer"&gt;Helix&lt;/a&gt;, a modal command-line editor not dissimilar from &lt;code&gt;vim&lt;/code&gt;. Helix comes with a lot more out of the box: it supports the Language Server Protocol (LSP), has many built in colour schemes, supports fuzzy finding files/buffers, project wide search and more. The keymap took some practice, but my entire configuration amounts to 8 lines including some blank lines and provides many more modern features.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;span class="lnt"&gt;8
&lt;/span&gt;&lt;span class="lnt"&gt;9
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&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="nx"&gt;theme&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;catppuccin_macchiato&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="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;editor&lt;/span&gt;&lt;span class="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;cursorline&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;text-width&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;rulers&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span 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;editor&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;lsp&lt;/span&gt;&lt;span class="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;display-inlay-hints&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;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;There is a separate file with some LSP configuration, but only a few more lines. Once I got this set up, I spent about 8 weeks using &lt;em&gt;just&lt;/em&gt; Helix to make sure that the keymap and operating model were sufficiently burned in to my mind. I&amp;rsquo;ve been really impressed - Helix is fast, the default features are great and I don&amp;rsquo;t anticipate returning to &lt;code&gt;vim&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;On the desktop side, I&amp;rsquo;d was intrigued by &lt;a href="https://zed.dev/" target="_blank" rel="noreferrer"&gt;Zed&lt;/a&gt;. I don&amp;rsquo;t always feel the need for a desktop editor, but there are projects that I prefer working on in a more graphical environment. I last tried Zed about 18 months ago and found it a little too sparse on features, but things have really evolved since then and there is an encouraging rate of change on the project. I&amp;rsquo;ve been using it most days for the last 4-5 months, and while it still lacks some of the polish (and features) of Visual Studio Code, it&amp;rsquo;s significantly lighter on resources, and I&amp;rsquo;m much happier with the defaults (details below)&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&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;ui_font_size&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;18&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;buffer_font_size&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;18&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;theme&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;mode&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;system&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;light&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Catppuccin Latte&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;dark&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Catppuccin Macchiato&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="nt"&gt;&amp;#34;buffer_font_family&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;MesloLGMDZ Nerd Font Mono&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;ui_font_family&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;.SystemUIFont&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;base_keymap&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;SublimeText&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;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="terminal" class="relative group"&gt;Terminal &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="#terminal" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;I switched to &lt;code&gt;zsh&lt;/code&gt; around 2013 and have used it every day since: starting with the infamous &lt;a href="https://ohmyz.sh/" target="_blank" rel="noreferrer"&gt;Oh My Zsh&lt;/a&gt;, &lt;a href="https://github.com/Powerlevel9k/powerlevel9k" target="_blank" rel="noreferrer"&gt;powerlevel9k&lt;/a&gt;, and subsequently &lt;a href="https://github.com/romkatv/powerlevel10k" target="_blank" rel="noreferrer"&gt;powerlevel10k&lt;/a&gt;, and finally settling on &lt;a href="https://starship.rs/" target="_blank" rel="noreferrer"&gt;Starship&lt;/a&gt; with a couple of &lt;code&gt;zsh&lt;/code&gt; plugins such as &lt;a href="https://github.com/zsh-users/zsh-autosuggestions" target="_blank" rel="noreferrer"&gt;&lt;code&gt;zsh-autosuggestions&lt;/code&gt;&lt;/a&gt; and &lt;a href="https://github.com/zsh-users/zsh-syntax-highlighting" target="_blank" rel="noreferrer"&gt;&lt;code&gt;zsh-syntax-highlighting&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;My &lt;code&gt;zsh&lt;/code&gt; config had become quite complex - an area in which NixOS/Home Manager really helped by providing (mostly)neat abstractions for plugins and &lt;code&gt;starship&lt;/code&gt; integration, but the equivalent configuration on Ubuntu would have been 100s of lines of &lt;code&gt;zsh&lt;/code&gt;, notwithstanding the need to load plugins in the right order, etc.&lt;/p&gt;
&lt;p&gt;Most of the configuration I was doing with &lt;code&gt;zsh&lt;/code&gt; was to imitate &lt;a href="https://fishshell.com/" target="_blank" rel="noreferrer"&gt;&lt;code&gt;fish&lt;/code&gt;&lt;/a&gt;. I&amp;rsquo;d tried &lt;code&gt;fish&lt;/code&gt; in the past, but reverted when I couldn&amp;rsquo;t use &lt;code&gt;sudo !!&lt;/code&gt;, or &lt;code&gt;/some/command $!&lt;/code&gt; and other tricks. I&amp;rsquo;d been following &lt;code&gt;fish&lt;/code&gt;&amp;rsquo;s rewrite and decided to give it another go, and have stuck with it since. It fits my JFUI mantra perfectly, leaving me with just a few lines of config for essentially identical functionality:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;set&lt;/span&gt; fish_greeting &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;fish_add_path ~/.nix-profile/bin
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;fish_add_path ~/.local/bin
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;fish_add_path ~/.cargo/bin
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;fish_add_path ~/go/bin
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;fish_add_path ~/scripts
&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; status is-interactive
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; starship init fish &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="nb"&gt;source&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; fzf --fish &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="nb"&gt;source&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; atuin init fish --disable-up-arrow &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="nb"&gt;source&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;end
&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;set&lt;/span&gt; -gx EDITOR hx
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;set&lt;/span&gt; -gx SUDO_EDITOR hx
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;I still occasionally fall foul of typing &lt;code&gt;sudo !!&lt;/code&gt;, but overall I&amp;rsquo;ve found &lt;code&gt;fish&lt;/code&gt; to be an excellent interactive shell replacement. In particular, the native tab completion support is leagues ahead of anything I ever managed to configure with &lt;code&gt;zsh&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;I moved from Alacritty to &lt;a href="https://ghostty.org/" target="_blank" rel="noreferrer"&gt;Ghostty&lt;/a&gt;, which has been absolutely excellent. It&amp;rsquo;s wicked fast, it has my favourite colour scheme built in, and I just love the way &lt;a href="https://github.com/mitchellh" target="_blank" rel="noreferrer"&gt;@mitchellh&lt;/a&gt; has set the project up for success in the long term. It also fits in nicely with my minimally configured applications, with excellent defaults out of the box.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-ini" data-lang="ini"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;theme&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;catppuccin-macchiato&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;font-family&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;MesloLGMDZ Nerd Font Mono&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;font-size&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;14&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;window-padding-x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;10&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;window-padding-y&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;10&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;window-decoration&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;false&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Finally: &lt;a href="https://github.com/tmux/tmux" target="_blank" rel="noreferrer"&gt;tmux&lt;/a&gt;, which I had been happily using for many years, but slowly collecting configuration for. I decided to give &lt;a href="https://zellij.dev/" target="_blank" rel="noreferrer"&gt;Zellij&lt;/a&gt; a try, and haven&amp;rsquo;t looked back. It also has a hellishly complicated configuration in my case 😉:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-kdl" data-lang="kdl"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nl"&gt;theme&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;catppuccin-macchiato&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="nl"&gt;default_layout&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;compact&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="nl"&gt;show_startup_tips&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;false&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="software-availability" class="relative group"&gt;Software Availability &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="#software-availability" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;I always felt incredibly spoiled by the vast availability of software for NixOS, and even more so that the contribution model was so simple that I was able to augment to collection myself.&lt;/p&gt;
&lt;p&gt;On Ubuntu, I use Snaps wherever possible and fall back to archive and installing software with &lt;code&gt;apt&lt;/code&gt; where it makes sense. If neither of those have what I need, I use the Nix package manager, which works well on Ubuntu. While some of the &amp;ldquo;additional&amp;rdquo; software might be installable using &lt;code&gt;go install&lt;/code&gt;, or &lt;code&gt;cargo install&lt;/code&gt;, or other package managers like &lt;code&gt;brew&lt;/code&gt;, &lt;code&gt;flakpak&lt;/code&gt;, &lt;code&gt;npm&lt;/code&gt;, etc., I wanted to keep things as simple as possible, so if it&amp;rsquo;s not available from Ubuntu-native sources I get it from &lt;code&gt;nixpkgs&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve included what I&amp;rsquo;m actually getting from the Snap store (63 snaps), and from &lt;code&gt;nixpkgs&lt;/code&gt; (21 packages) below.&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;Installed snaps&lt;/summary&gt;
&lt;pre&gt;
❯ snap list | tail -n+2
agendrr 0.1.1 3 latest/stable jnsgruk* -
astral-uv 0.7.13 627 latest/stable lengau classic
audacity 3.7.1 1208 latest/candidate snapcrafters* -
bare 1.0 5 latest/stable canonical** base
bitwarden 2025.5.1 140 latest/stable bitwarden** -
charmcraft 3.4.6 6672 latest/stable canonical** classic
code 18e3a1ec 197 latest/stable vscode** classic
core 16-2.61.4-20250508 17212 latest/stable canonical** core
core18 20250523 2887 latest/stable canonical** base
core20 20250526 2599 latest/stable canonical** base
core22 20250528 2010 latest/stable canonical** base
core24 20250526 1006 latest/stable canonical** base
desktop-security-center 0+git.f7ad73a 59 1/stable/… canonical** -
discord 0.0.98 243 latest/candidate snapcrafters* -
docker 28.1.1+1 3265 latest/stable canonical** -
dotrun 1.4.8 85 latest/stable canonicalwebteam -
ffmpeg-2404 7.1.1 75 latest/stable snapcrafters* -
firefox 139.0.4-1 6316 latest/stable/… mozilla** -
firmware-updater 0+git.22198be 167 1/stable/… canonical** -
ghstat 0.4.1 91 latest/stable jnsgruk* -
ght 1.11.7 110 latest/edge tbmb -
gimp 3.0.4 525 latest/stable snapcrafters* -
gnome-3-28-1804 3.28.0-19-g98f9e67.98f9e67 198 latest/stable canonical** -
gnome-3-34-1804 0+git.3556cb3 93 latest/stable canonical** -
gnome-42-2204 0+git.38ea591 202 latest/stable/… canonical** -
gnome-46-2404 0+git.d9f8bf6-sdk0+git.c8a281c 90 latest/stable canonical** -
go 1.24.4 10907 latest/stable canonical** classic
gopls 0.19.0 1089 latest/stable alexmurray* classic
goreleaser 2.10.2 1060 latest/stable caarlos0 classic
gtk-common-themes 0.1-81-g442e511 1535 latest/stable/… canonical** -
helix 25.01.1 91 latest/stable lauren-brock classic
icloudpd 1.28.1 12 latest/stable jnsgruk* -
jhack 0.4.4.0.13 461 latest/stable ppasotti -
jq 1.5+dfsg-1 6 latest/stable mvo* -
juju 3.6.7 31266 3/stable canonical** -
kubectl 1.33.2 3609 latest/stable canonical** classic
lxd 5.21.3-c5ae129 33110 5.21/stable canonical** -
mattermost-desktop 5.12.1 789 latest/stable snapcrafters* -
mesa-2404 24.2.8-snap183 887 latest/stable canonical** -
multipass 1.15.1 14535 latest/stable canonical** -
node 22.16.0 10226 22/stable iojs** classic
obsidian 1.8.10 47 latest/stable obsidianmd classic
pinta 3.0.1 56 latest/stable james-carroll* -
prompting-client 0+git.d542a5d 104 1/stable/… canonical** -
rambox 2.4.1 44 latest/stable ramboxapp** -
rockcraft 1.12.0 3367 latest/stable canonical** classic
ruff 0.11.13 1377 latest/stable lengau -
rustup 1.27.1 1471 latest/stable canonical** classic
shellcheck v0.10.0 1725 latest/stable koalaman -
shfmt 3.5.1 33 latest/stable ankushpathak -
signal-desktop 7.58.0 799 latest/candidate snapcrafters* -
snap-store 0+git.90575829 1270 2/stable/… canonical** -
snapcraft 8.9.4 15082 latest/stable canonical** classic
snapd 2.68.5 24718 latest/stable canonical** snapd
snapd-desktop-integration 0.9 253 latest/stable/… canonical** -
sublime-merge 2102 95 latest/stable snapcrafters* classic
thonny 4.1.7 239 latest/stable sameersharma2006 -
thunderbird 128.11.1esr-1 737 latest/stable canonical** -
todoist 9.17.0 1340 latest/stable doist** -
typescript-language-server 4.3.4 211 latest/stable alexmurray* -
yazi shipped 293 latest/stable sxyazi classic
yq v4.44.5 2634 latest/stable mikefarah -
zellij 0.42.2 41 latest/stable dominz88 classic
&lt;/pre&gt;
&lt;/details&gt;
&lt;details&gt;
&lt;summary&gt;Installed Nix packages&lt;/summary&gt;
&lt;pre&gt;
❯ nix profile list | grep -Po "Name:[ ]*\K.+\$"
atuin
bash-language-server
cargo-udeps
deadnix
fzf
gh
gofumpt
nil
nixd
nixfmt-rfc-style
prettier
pyright
python-lsp-server
spread
starship
statix
taplo
terraform-ls
typos-lsp
vscode-langservers-extracted
yaml-language-server
&lt;/pre&gt;
&lt;/details&gt;
&lt;p&gt;I continue to find Nix development shells useful, and even &lt;a href="https://github.com/jnsgruk/jnsgr.uk/blob/5f9f2fe2ced2416e8a1fb3116d88d1b51c9fdbc7/flake.nix#L99-L122" target="_blank" rel="noreferrer"&gt;use one&lt;/a&gt; to develop this site.&lt;/p&gt;
&lt;h2 id="configuration-management" class="relative group"&gt;Configuration 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="#configuration-management" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;In the past I&amp;rsquo;ve used all kinds of scripts, Ansible playbooks and dotfile managers to solve this problem, and its a problem that was solved very elegantly by NixOS/Home Manager. I experimented with Home Manager on Ubuntu to manage dotfiles and configuration, but found the experience had more rough edges than I would like, and didn&amp;rsquo;t really adhere to my JFUI principles.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve settled on a directory full of idempotent, single-purpose scripts which get executed by a wrapper named &lt;code&gt;provision&lt;/code&gt;. This is somewhat inspired by &lt;a href="https://omakub.org/" target="_blank" rel="noreferrer"&gt;Omakub&lt;/a&gt;, but without the menus and configuration they supply to allow their users some customisation. The scripts install packages, write configuration with tools like &lt;code&gt;gsettings&lt;/code&gt; and symlink configuration into place where needed:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;❯ ls
app-1password dev-python tool-agendrr
app-chrome dev-rust tool-atuin
app-flameshot font-meslo tool-gearlever
app-ghostty hw-yubikey tool-gh
app-obsidian kara-audioengine tool-git
app-pinta kara-backup tool-helix
app-rambox kara-data-disk tool-junction
app-signal kara-hiring-automation tool-lxd
app-sublime-merge kara-hiring-reports tool-multipass
app-thunderbird provision tool-podman
app-todoist system-flatpak tool-spread
configs system-fs tool-starship
dev-charms system-gnome tool-syncthing
dev-containers system-gnome-extensions tool-tailscale
dev-go system-nix tool-zed
dev-node system-shell tool-zellij
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;An example of a specific script, such as &lt;code&gt;tool-zellij&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#!/usr/bin/env bash
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;set&lt;/span&gt; -e
&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="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; &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&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo snap install --classic zellij
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mkdir -p &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;HOME&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/.config/zellij&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ln -sf &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;DIR&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/configs/zellij/config.kdl&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;HOME&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/.config/zellij/config.kdl&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;The &lt;code&gt;provision&lt;/code&gt; script is similarly simple (and naive):&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#!/usr/bin/env bash
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;set&lt;/span&gt; -ex
&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="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; &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&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;sudo apt-get update
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt-get upgrade -y
&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;categories&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;system hw dev tool app font &lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;hostname&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;for&lt;/span&gt; c in &lt;span class="nv"&gt;$categories&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="k"&gt;for&lt;/span&gt; x in &lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;c&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;source&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; &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="k"&gt;done&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;This is &lt;em&gt;just about&lt;/em&gt; satisfactory. I&amp;rsquo;ve got into the habit of only ever installing software by creating the relevant script and configuration. If I don&amp;rsquo;t need it to persist, the work gets done in an ephemeral LXD container/VM then thrown away.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m working on a better solution for this named &lt;code&gt;miso&lt;/code&gt;, short for &amp;ldquo;Make It So&amp;rdquo;. This a homegrown, multi-host configuration management tool for my machines that draws inspiration from &lt;code&gt;cloud-init&lt;/code&gt;, &lt;code&gt;home-manager&lt;/code&gt;, &lt;code&gt;terraform&lt;/code&gt; and a few others. I&amp;rsquo;ll write about that in a future post when the code is a little more complete, but there is an example of an early configuration format I&amp;rsquo;m targeting available as a &lt;a href="https://gist.github.com/jnsgruk/64b7418183bd3abfbe68e878907608e3" target="_blank" rel="noreferrer"&gt;gist&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Everything in the linked config file is currently implemented and working with a decent suite of integration tests - but I&amp;rsquo;ve got a lot of tidying to do with error handling and such before I release it.&lt;/p&gt;
&lt;h2 id="so-what-about-nix" class="relative group"&gt;So What About Nix? &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="#so-what-about-nix" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;I thoroughly enjoyed my adventures with Nix, and I consider having learned how to package software with Nix and use the available tooling to manage servers, desktops and development shells to have been incredibly worthwhile.&lt;/p&gt;
&lt;p&gt;Even &lt;em&gt;if&lt;/em&gt; I were to never touch Nix again, the general packaging and distribution engineering skills I learned have been invaluable, and I&amp;rsquo;m grateful to everyone who helped me on that journey through Matrix chats, Pull Requests and Mastodon interactions.&lt;/p&gt;
&lt;p&gt;I remain active on the ~35 packages in &lt;a href="https://github.com/NixOS/nixpkgs" target="_blank" rel="noreferrer"&gt;&lt;code&gt;nixpkgs&lt;/code&gt;&lt;/a&gt; for which I&amp;rsquo;m the maintainer. I continue to use Nix for development shells, CI and for certain packages on my Ubuntu machines. I have archived my &lt;a href="https://github.com/jnsgruk/nixos-config" target="_blank" rel="noreferrer"&gt;flake&lt;/a&gt; for now because it&amp;rsquo;s not being maintained, but I&amp;rsquo;ve left it there in case there are any patterns that might be useful for others.&lt;/p&gt;
&lt;h2 id="summary" class="relative group"&gt;Summary &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="#summary" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;Ubuntu has been very stable on my desktop, server and both of my laptops. I&amp;rsquo;ve enjoyed the level of integration and polish that comes with no effort in the desktop environment, and managing less configuration has been a freeing experience - even if some of my apps no longer have matching themes 😱.&lt;/p&gt;
&lt;p&gt;Provisioning and configuration management are less structured and more cumbersome in Ubuntu, but that has driven me to build my own tool which was good fun, and gave me a nice challenge to solve through my journey learning Rust! I hope to learn from the project in a way that helps inform the development of Ubuntu itself in future releases.&lt;/p&gt;
&lt;p&gt;If you&amp;rsquo;re into numbers, here are the stats for my renewed &amp;ldquo;config&amp;rdquo; directory, which contains all of the text-based configuration &amp;amp; scripts for my machines:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;----------------------------------------------------------
Language files blank comment code
----------------------------------------------------------
Bourne Again Shell 47 154 81 413
TOML 3 13 1 53
Fish Shell 1 13 3 38
JSON 1 0 0 35
----------------------------------------------------------
SUM: 52 180 85 539
----------------------------------------------------------
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;From 3982 lines, to 539 lines, and much of that could be reduced if it wasn&amp;rsquo;t for the slightly repetitive nature of maintaining separate, idempotent scripts. Not bad.&lt;/p&gt;
&lt;p&gt;As much as I feared the transition, my journey back to Ubuntu has been very enjoyable. I&amp;rsquo;m not &amp;ldquo;quitting Nix&amp;rdquo; or &amp;ldquo;over it&amp;rdquo;, but at least for now I&amp;rsquo;m enjoying a less complex existence with my personal computers.&lt;/p&gt;
&lt;p&gt;Thanks for reading!&lt;/p&gt;</description></item><item><title>Own Your Calendar</title><link>https://jnsgr.uk/2025/03/own-your-calendar/</link><pubDate>Mon, 03 Mar 2025 00:00:00 +0000</pubDate><guid>https://jnsgr.uk/2025/03/own-your-calendar/</guid><description>&lt;h2 id="introduction" class="relative group"&gt;Introduction &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="#introduction" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;Over the past few years, I&amp;rsquo;ve come to a series of realisations about how I can get the most from my calendar, or rather how to get the most from my time at work, while preventing work from spilling out into my personal life too much.&lt;/p&gt;
&lt;p&gt;Staying on top of my calendar has helped me manage my time better. It helps me get more done, and set reasonable work-life boundaries. Calendar management helps my colleagues understand how I spend my time, what I&amp;rsquo;m working on, and when it might be best to book my time.&lt;/p&gt;
&lt;h2 id="bound-your-day" class="relative group"&gt;Bound Your Day &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="#bound-your-day" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;The first step toward taking control of your calendar is to bound your day. In more conventional workplaces where everyone commutes into an office, working patterns are frequently more predictable. With a remote, globally distributed workforce things are harder to predict. Your 9-5 might be in the middle of the night for others, and either you or your colleagues might have flexible working arrangements that make their work hours less obvious.&lt;/p&gt;
&lt;p&gt;One way to help colleagues book time with you smoothly is by clearly indicating when your day starts, when it ends, and when you&amp;rsquo;ll break for lunch. Your calendar tool might do a good job of this already.&lt;/p&gt;
&lt;p&gt;Here&amp;rsquo;s an indicative example of how I set up my calendar:&lt;/p&gt;
&lt;p&gt;&lt;a href="01.png"&gt;
&lt;figure&gt;
&lt;picture
class="mx-auto my-0 rounded-md"
&gt;
&lt;source
srcset="https://jnsgr.uk/2025/03/own-your-calendar/01_hu_c22420f58e86b327.webp 330w,https://jnsgr.uk/2025/03/own-your-calendar/01_hu_ca3b43a0edfcb222.webp 660w
,https://jnsgr.uk/2025/03/own-your-calendar/01_hu_1ca38b2df4caa3db.webp 1024w
,https://jnsgr.uk/2025/03/own-your-calendar/01_hu_5369a19e3ae6d3d0.webp 1155w
"
sizes="100vw"
type="image/webp"
/&gt;
&lt;img
width="1155"
height="942"
class="mx-auto my-0 rounded-md"
alt="A baseline empty calendar showing start and end of day, as well as a lunch break."
loading="lazy" decoding="async"
src="https://jnsgr.uk/2025/03/own-your-calendar/01_hu_eb19094a42a2aa55.png" srcset="https://jnsgr.uk/2025/03/own-your-calendar/01_hu_f0c0ce05a9b949f6.png 330w,https://jnsgr.uk/2025/03/own-your-calendar/01_hu_eb19094a42a2aa55.png 660w
,https://jnsgr.uk/2025/03/own-your-calendar/01_hu_464c632f2bb8989f.png 1024w
,https://jnsgr.uk/2025/03/own-your-calendar/01.png 1155w
"
sizes="100vw"
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Some of you are raising your eyebrow over taking an &lt;em&gt;hour for lunch&lt;/em&gt; every day, but hear me out. This time is not just used for the critical act of feeding yourself, but gives you the chance to get some fresh air, rest your eyes and give your brain a chance to focus on something else for a while. How many times have you solved a complicated problem in the shower? This is the same thing.&lt;/p&gt;
&lt;p&gt;Indicating to your colleagues through status messages that you&amp;rsquo;re on a break on Slack/Mattermost/Teams/whatever can also be helpful.&lt;/p&gt;
&lt;p&gt;There may be occasions when people need to get hold of you &lt;em&gt;right now&lt;/em&gt;, and you should let them know how to do that. For me, the &lt;a href="https://en.wikipedia.org/wiki/Bat_phone" target="_blank" rel="noreferrer"&gt;bat phone&lt;/a&gt; of choice is &lt;a href="https://signal.org/" target="_blank" rel="noreferrer"&gt;Signal&lt;/a&gt;. No matter how much I silence my work email notifications, or use Do Not Disturb on Mattermost, Signal is the only app that never gets silenced because it&amp;rsquo;s what I use to communicate with those closest to me - so my colleagues know to use that if they need to, and that frees me up to concentrate on the day and not get too distracted by a stream of instant messages and emails.&lt;/p&gt;
&lt;h2 id="make-space-for-focus" class="relative group"&gt;Make Space For Focus &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="#make-space-for-focus" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;There are two kinds of focus time I need in my day: one to triage emails and messages, respond to &amp;ldquo;new tasks&amp;rdquo; and another to progress &amp;ldquo;planned work&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;Like many others, I get a lot of email and instant messages. Because of the global nature of my company, these tend to keep coming overnight. I like to set aside 30 minutes every morning assigned to &amp;ldquo;Catch Up&amp;rdquo;. In that time, I respond to emails and messages I&amp;rsquo;ve received overnight, review my schedule for the rest of the day, and set up &lt;a href="https://obsidian.md" target="_blank" rel="noreferrer"&gt;Obsidian&lt;/a&gt; for note-taking (see &lt;a href="https://jnsgr.uk/2024/07/how-i-computer-in-2024/#productivity-apps" target="_blank" rel="noreferrer"&gt;How I Computer in 2024&lt;/a&gt;). As a side-effect of this, I&amp;rsquo;m always up to date by the time I start my first meeting each day.&lt;/p&gt;
&lt;p&gt;For planned work, I set aside at least one hour per day. This is often neglected, leading to people becoming overwhelmed by meetings: group meetings, team 1:1s, daily/weekly/fortnightly/monthly rituals, leadership meetings, etc. Before long, there&amp;rsquo;s no slack in their day to actually &lt;em&gt;think&lt;/em&gt; about their work.&lt;/p&gt;
&lt;p&gt;&lt;a href="02.png"&gt;
&lt;figure&gt;
&lt;picture
class="mx-auto my-0 rounded-md"
&gt;
&lt;source
srcset="https://jnsgr.uk/2025/03/own-your-calendar/02_hu_8bfb5d3db7dbc906.webp 330w,https://jnsgr.uk/2025/03/own-your-calendar/02_hu_ed26453af1f10233.webp 660w
,https://jnsgr.uk/2025/03/own-your-calendar/02_hu_90ffd221078d281b.webp 1024w
,https://jnsgr.uk/2025/03/own-your-calendar/02_hu_c0fc93c1477aa032.webp 1155w
"
sizes="100vw"
type="image/webp"
/&gt;
&lt;img
width="1155"
height="942"
class="mx-auto my-0 rounded-md"
alt="Daily focus time slots placed into the calendar, yet to be labelled."
loading="lazy" decoding="async"
src="https://jnsgr.uk/2025/03/own-your-calendar/02_hu_cf638e4373a2109c.png" srcset="https://jnsgr.uk/2025/03/own-your-calendar/02_hu_c9326ac996778f90.png 330w,https://jnsgr.uk/2025/03/own-your-calendar/02_hu_cf638e4373a2109c.png 660w
,https://jnsgr.uk/2025/03/own-your-calendar/02_hu_9e8b4592ea31b3e8.png 1024w
,https://jnsgr.uk/2025/03/own-your-calendar/02.png 1155w
"
sizes="100vw"
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;An hour a day is a minimum, but at least by blocking it out you guarantee that minimum. Depending on your role and responsibilities, these slots may occupy more of less of your week.&lt;/p&gt;
&lt;p&gt;These occur at the same times each week in my calendar where possible, making it easier for my colleagues to plan meetings when they need to. I label these slots with what I&amp;rsquo;ll focus on in that time. In my calendar these are recurring events named &amp;ldquo;Focus Time&amp;rdquo;, then every Monday during my &amp;ldquo;Catch Up&amp;rdquo; slot, I figure out what&amp;rsquo;s important to get done in that week, and label each slot with what I plan to work on. You might label a slot with the Jira ticket you&amp;rsquo;ll tackle, the specific Professional Development activity you&amp;rsquo;re planning, the document you&amp;rsquo;ll review or maybe it&amp;rsquo;s a Pair Programming session with a colleague.&lt;/p&gt;
&lt;p&gt;In my experience, this practice helps my colleagues understand what I&amp;rsquo;m working on, but on busy days it also helps me avoid wasting time deciding what to work on when I become free between meetings - my calendar tells me!&lt;/p&gt;
&lt;p&gt;Once I&amp;rsquo;ve conducted my Monday &amp;ldquo;Catch Up&amp;rdquo; each week, the focus blocks in my calendar look more like this:&lt;/p&gt;
&lt;p&gt;&lt;a href="03.png"&gt;
&lt;figure&gt;
&lt;picture
class="mx-auto my-0 rounded-md"
&gt;
&lt;source
srcset="https://jnsgr.uk/2025/03/own-your-calendar/03_hu_38624cdbf5366180.webp 330w,https://jnsgr.uk/2025/03/own-your-calendar/03_hu_e716a12daacc79fd.webp 660w
,https://jnsgr.uk/2025/03/own-your-calendar/03_hu_d82e95ba66483c0c.webp 1024w
,https://jnsgr.uk/2025/03/own-your-calendar/03_hu_656aecac4894bdcc.webp 1155w
"
sizes="100vw"
type="image/webp"
/&gt;
&lt;img
width="1155"
height="942"
class="mx-auto my-0 rounded-md"
alt="Daily focus time slots now labelled with planned tasks for the week."
loading="lazy" decoding="async"
src="https://jnsgr.uk/2025/03/own-your-calendar/03_hu_f8d1021ae4b35f6a.png" srcset="https://jnsgr.uk/2025/03/own-your-calendar/03_hu_e091a88c6d42e433.png 330w,https://jnsgr.uk/2025/03/own-your-calendar/03_hu_f8d1021ae4b35f6a.png 660w
,https://jnsgr.uk/2025/03/own-your-calendar/03_hu_97048a630b14de2e.png 1024w
,https://jnsgr.uk/2025/03/own-your-calendar/03.png 1155w
"
sizes="100vw"
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;In the above example, I&amp;rsquo;ve extended the Thursday slot to get something specific done. I avoid planning contiguous focus blocks for more than 2 or 3 hours. Much beyond that, and most people will begin to lose focus, become less effective and more frustrated, ultimately getting less done. I find I&amp;rsquo;m better taking a break to do something else, then coming back to the task later with fresh eyes.&lt;/p&gt;
&lt;h2 id="plan-regular-meetings" class="relative group"&gt;Plan Regular Meetings &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="#plan-regular-meetings" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;I try to be deliberate about the meetings I attend. In most roles there are meetings which are an inescapable reality. These might include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Team 1:1s&lt;/li&gt;
&lt;li&gt;Leadership Syncs&lt;/li&gt;
&lt;li&gt;Project Reviews&lt;/li&gt;
&lt;li&gt;Planning Meetings&lt;/li&gt;
&lt;li&gt;Mentoring/Coaching&lt;/li&gt;
&lt;li&gt;Demos&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These will vary in length and cadence. Try to schedule your most demanding meetings at the time of day when you&amp;rsquo;re at your best; for me this translates into scheduling most of my team 1:1s in the morning (timezones permitting!).&lt;/p&gt;
&lt;p&gt;If you have regular fortnightly meetings, try to ensure that there is something scheduled on the &amp;ldquo;off weeks&amp;rdquo; at the same time. This will prevent accidentally scheduling a weekly meeting in a slot where you&amp;rsquo;re already committed fortnightly - a surprisingly easy mistake.&lt;/p&gt;
&lt;p&gt;&lt;a href="04.png"&gt;
&lt;figure&gt;
&lt;picture
class="mx-auto my-0 rounded-md"
&gt;
&lt;source
srcset="https://jnsgr.uk/2025/03/own-your-calendar/04_hu_35d08a70d315e207.webp 330w,https://jnsgr.uk/2025/03/own-your-calendar/04_hu_55b8aa7b98328602.webp 660w
,https://jnsgr.uk/2025/03/own-your-calendar/04_hu_4ff6c3f1a4a873d4.webp 1024w
,https://jnsgr.uk/2025/03/own-your-calendar/04_hu_ad01e6f618aaa04a.webp 1155w
"
sizes="100vw"
type="image/webp"
/&gt;
&lt;img
width="1155"
height="942"
class="mx-auto my-0 rounded-md"
alt="Regular meetings planned into the schedule."
loading="lazy" decoding="async"
src="https://jnsgr.uk/2025/03/own-your-calendar/04_hu_f452fafbdf770192.png" srcset="https://jnsgr.uk/2025/03/own-your-calendar/04_hu_f8a2beb76ec541b0.png 330w,https://jnsgr.uk/2025/03/own-your-calendar/04_hu_f452fafbdf770192.png 660w
,https://jnsgr.uk/2025/03/own-your-calendar/04_hu_21847060a74a9d27.png 1024w
,https://jnsgr.uk/2025/03/own-your-calendar/04.png 1155w
"
sizes="100vw"
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I find it helpful to label meetings with their cadence. This may not help day-to-day, but can help in reviewing how you spend your time (more on that later).&lt;/p&gt;
&lt;p&gt;In my current role, I attend a business review every six weeks. In these weeks, Tuesday and Thursday afternoons are consumed by business review activity. As a result, I make sure there are no recurring meetings in those times to avoid a scramble to re-arrange them all every six weeks. In weeks where I don&amp;rsquo;t have Business Reviews, these are great spots to use for focus time, interviews, and other ad-hoc meetings.&lt;/p&gt;
&lt;h2 id="maintain-blank-space" class="relative group"&gt;Maintain Blank Space &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="#maintain-blank-space" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;This might be the most important point in the whole post: ensure there is blank space in your calendar &lt;em&gt;every day&lt;/em&gt; outside of your regular planned events.&lt;/p&gt;
&lt;p&gt;This can be hard to achieve, and may not manifest in you &lt;em&gt;actually having&lt;/em&gt; blank space by the time each day starts, but if your work week is already 100% booked with regular events and planned work, how will you respond to unplanned events? Unexpected customer meetings? Without any blank space in your calendar, you&amp;rsquo;re destined to spend an unhealthy amount of time worrying about or rearranging your calendar, and struggle to get things done.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m able to be more present in meetings, more able to ignore notifications and distractions when I know there will be time in the day to get around to them. If there is never any space for these tasks, I&amp;rsquo;m easily distracted by staying on top of message notifications, emails, etc.&lt;/p&gt;
&lt;p&gt;A good test of this is to look forward 2-3 weeks from now in your calendar. What does it look like? If there is no blank space in your calendar, then start reviewing regular commitments and get it back under control.&lt;/p&gt;
&lt;p&gt;I recently re-read &lt;a href="https://uk.bookshop.org/p/books/it-doesn-t-have-to-be-crazy-at-work-jason-fried/1364337?ean=9780008323448" target="_blank" rel="noreferrer"&gt;It Doesn&amp;rsquo;t Have To Be Crazy At Work&lt;/a&gt;, having read it first some years ago. While there are some minor points that don&amp;rsquo;t quite resonate with me, the general principle that we should stop glorifying packed schedules and competing with our colleagues to be the busiest or the most overworked is absolutely spot on.&lt;/p&gt;
&lt;p&gt;If you&amp;rsquo;re in a leadership position, this is not just for your benefit but for everyone around you too. People look to leadership for their example; organisations and teams mimic the habits of their leaders over time. If you&amp;rsquo;re in work from 6am to 9pm every day and your schedule is constantly back-to-back, there&amp;rsquo;s a good chance others will copy, glorify, and expect those behaviours of others (yes, even if you tell them they don&amp;rsquo;t have to, and you don&amp;rsquo;t expect it of them, and&amp;hellip;).&lt;/p&gt;
&lt;h2 id="bookable-placeholders" class="relative group"&gt;Bookable Placeholders &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="#bookable-placeholders" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;You may have recurring tasks each week that are less predictable. This could be interviews, customer calls, or anything where you expect to perform a certain number each week, but can&amp;rsquo;t always predict the exact timings in advance.&lt;/p&gt;
&lt;p&gt;My approach is to use blank space for this, but an alternate approach is to add placeholders in your calendar that indicate when you would prefer for those events to be scheduled. This can save time and round-trips via email/instant message, and reduce the number of times you&amp;rsquo;re booked for something at a time that doesn&amp;rsquo;t suit you.&lt;/p&gt;
&lt;p&gt;Most calendaring tools will allow you to mark time like this in your calendar without it showing you as &amp;ldquo;Busy&amp;rdquo;. This will take some experimentation while you understand your average weekly commitment and when those events are most likely to occur, but might look something like this:&lt;/p&gt;
&lt;p&gt;&lt;a href="05.png"&gt;
&lt;figure&gt;
&lt;picture
class="mx-auto my-0 rounded-md"
&gt;
&lt;source
srcset="https://jnsgr.uk/2025/03/own-your-calendar/05_hu_b80865ac2ac6fbee.webp 330w,https://jnsgr.uk/2025/03/own-your-calendar/05_hu_f0f75d395b23663f.webp 660w
,https://jnsgr.uk/2025/03/own-your-calendar/05_hu_ac06990f5bc25ce2.webp 1024w
,https://jnsgr.uk/2025/03/own-your-calendar/05_hu_fbf7dfedc0761d4a.webp 1155w
"
sizes="100vw"
type="image/webp"
/&gt;
&lt;img
width="1155"
height="942"
class="mx-auto my-0 rounded-md"
alt="Placeholders for regular but unplanned events such as interviews can help your colleagues schedule your time more appropriately."
loading="lazy" decoding="async"
src="https://jnsgr.uk/2025/03/own-your-calendar/05_hu_ab6282813a9412ce.png" srcset="https://jnsgr.uk/2025/03/own-your-calendar/05_hu_1437191c3e3ed88e.png 330w,https://jnsgr.uk/2025/03/own-your-calendar/05_hu_ab6282813a9412ce.png 660w
,https://jnsgr.uk/2025/03/own-your-calendar/05_hu_1bee912efbd4bd04.png 1024w
,https://jnsgr.uk/2025/03/own-your-calendar/05.png 1155w
"
sizes="100vw"
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="review-regularly" class="relative group"&gt;Review Regularly &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="#review-regularly" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;Even if you do all of the above, your calendar will fill up over time. You&amp;rsquo;ll get invited to the next important monthly review meeting, perhaps collect an extra report or two, take responsibility for a major project, or be asked to mentor a colleague. There are countless ways in which your blank space can get eaten up, and when your calendar becomes cluttered, it&amp;rsquo;s likely to create a higher mental load which distracts you from the work you really need to get done.&lt;/p&gt;
&lt;p&gt;Pick a cadence on which you review all of your regular engagements for necessity, length and frequency. At Canonical we have company roadmap sprints every 3 months, and I&amp;rsquo;ve found that to be a useful cadence (and reminder) to review my calendar. After each sprint, I spend one of my focus blocks staring at my calendar trying to work out which planned meetings are still useful and effective, and which I&amp;rsquo;m going to either stop attending or reduce the frequency of.&lt;/p&gt;
&lt;p&gt;A couple of examples where I&amp;rsquo;ll &amp;ldquo;trim the fat&amp;rdquo;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Group meetings that have grown too large over time, and become less effective.&lt;/li&gt;
&lt;li&gt;Mentoring or coaching engagements where significant progress has been made, and the frequency can be reduced. Perhaps the relationship with the person you&amp;rsquo;re mentoring is good enough that you can revert to ad-hoc scheduling when they need assistance.&lt;/li&gt;
&lt;li&gt;Placeholders that are going unused week-to-week.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="remote-work-and-flexibility" class="relative group"&gt;Remote Work and Flexibility &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="#remote-work-and-flexibility" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;One of the advantages of remote work is the flexibility it affords employees, but it&amp;rsquo;s important to be respectful of that privilege. The foundations of most effective workplaces are trust and respect. A structured and well-planned calendar doesn&amp;rsquo;t mean reducing flexibility - in many cases a structured calendar can enable more flexibility.&lt;/p&gt;
&lt;p&gt;If you&amp;rsquo;re fortunate enough to work remotely, then you should take advantage of that, but it&amp;rsquo;s also important to stay accountable and make it predictable where you can. If you go to the gym every Wednesday at 10am, then put that in your calendar and make it clear on your calendar where that time is made up. That way, your colleagues can plan around it.&lt;/p&gt;
&lt;p&gt;I like mountain biking and I find the winter (in the UK) pretty miserable. I go mountain biking on a Monday afternoon from 1300-1600, but then I work on a Monday from 1900-2200. This actually fits in with my role - a number of my reports are in the US or Australia, and returning to work on a Monday evening means I can do our 1:1s in their timezone without asking them to work late/early.&lt;/p&gt;
&lt;p&gt;For me the benefit is actually seeing daylight for a decent length of time in the middle of the day. If the weather is poor and I don&amp;rsquo;t feel like biking, I do something else on Monday afternoons, but I still keep that commitment to my US/APAC colleagues in the evening. This consistency makes it easy to plan around, but still gives me plenty of chances to go biking.&lt;/p&gt;
&lt;h2 id="tips--tricks" class="relative group"&gt;Tips &amp;amp; Tricks &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="#tips--tricks" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;There are some other tricks that can help you get the most from your calendar:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Buffer Time&lt;/strong&gt;: Give yourself a few minutes between meetings. Whether it be to get up and stretch your legs, grab a drink or whatever. I configure Google Calendar to default to 25 minute and 50 minute meetings, rather than 30 minutes and 60 minutes. On the days I&amp;rsquo;m disciplined enough to stick to that, it gives me a few valuable minutes between meetings to pee!&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Colour Coding/Emojis&lt;/strong&gt;: I used to dismiss this, but have come to really appreciate it. Distinctively marking items in your calendar can help you subconsciously prepare for what&amp;rsquo;s coming, as well as help you see where you spend the majority of your time. I use dark blue regular meetings, yellow &amp;ldquo;People&amp;rdquo; meetings, purple for focus blocks, green for external meetings and orange for business/commerical review calls.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Task Management&lt;/strong&gt;: When I&amp;rsquo;m asked to do something which will take me more than 5 minutes, I generally put that task in my calendar. If I&amp;rsquo;m asked to review a pull request and I think it&amp;rsquo;ll take me 30 minutes, I create a 30 minute event in some of the blank space named &amp;ldquo;Review PR #113&amp;rdquo;. This ensures I get the time I need, and the requester gets to see when I&amp;rsquo;ve planned the work.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="summary" class="relative group"&gt;Summary &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="#summary" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;This post summarises a collection of lessons I&amp;rsquo;ve learned over time. Each of these have incrementally improved my time management at work. I feel more productive and less stressed, which means I find it easier to switch off from work in the evening and at weekend.&lt;/p&gt;
&lt;p&gt;My final note is on flexibility. Most of this article describes principles - ideas you should &lt;em&gt;try&lt;/em&gt; to implement. In reality, collaboration and calendar management across teams and timezones is hard. In my experience applying these principles helps account for the &amp;ldquo;messier&amp;rdquo; weeks in my work schedule and helps me keep order, but nonetheless you won&amp;rsquo;t always have total control and you might need to be flexible to accommodate some of your colleagues.&lt;/p&gt;
&lt;p&gt;Until next time!&lt;/p&gt;
&lt;p&gt;(And thanks to my wife Laura for helping me refine and edit this post!)&lt;/p&gt;</description></item><item><title>How I Computer in 2024</title><link>https://jnsgr.uk/2024/07/how-i-computer-in-2024/</link><pubDate>Wed, 31 Jul 2024 00:00:00 +0000</pubDate><guid>https://jnsgr.uk/2024/07/how-i-computer-in-2024/</guid><description>&lt;blockquote&gt;
&lt;p&gt;Since writing this post, I&amp;rsquo;ve posted &lt;a href="https://jnsgr.uk/2025/06/from-nixos-to-ubuntu/" target="_blank" rel="noreferrer"&gt;an update&lt;/a&gt; about moving from NixOS to Ubuntu with more up to date content on my current setup.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="introduction" class="relative group"&gt;Introduction &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="#introduction" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;I&amp;rsquo;m always fascinated to see how people use their computers - which applications they choose, how they set up their desktop environments and even how their screens are laid out on their desk. I&amp;rsquo;ve learned some great tricks from friends and colleagues over the years, so I thought I&amp;rsquo;d write up how I use my machines in 2024.&lt;/p&gt;
&lt;p&gt;The setup I&amp;rsquo;m using today has been quite static for a couple of years, with only minor adjustments. Each time I change something significant, I leave it for at least a couple of months to try and build muscle memory and see if I&amp;rsquo;m going to make the adjustment permanent.&lt;/p&gt;
&lt;h2 id="hardware" class="relative group"&gt;Hardware &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="#hardware" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;h3 id="desktop" class="relative group"&gt;Desktop &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="#desktop" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h3&gt;&lt;p&gt;My main machine is a custom built desktop machine. It&amp;rsquo;s in a sombre looking, all black &lt;a href="https://www.bequiet.com/en/case/1501" target="_blank" rel="noreferrer"&gt;beQuiet Silent Base 600&lt;/a&gt; case. I&amp;rsquo;ve never been into RGB lights - I&amp;rsquo;m much more into good thermals and &lt;em&gt;silent&lt;/em&gt; operation. The full spec is as follows:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;CPU&lt;/strong&gt;: &lt;a href="https://www.amd.com/en/products/processors/desktops/ryzen/7000-series/amd-ryzen-9-7950x.html" target="_blank" rel="noreferrer"&gt;AMD Ryzen 9 7950X&lt;/a&gt;&lt;br/&gt;
&lt;strong&gt;GPU&lt;/strong&gt;: &lt;a href="https://www.xfxforce.com/shop/xfx-speedster-merc310-7900xt" target="_blank" rel="noreferrer"&gt;AMD Radeon RX 7900XT&lt;/a&gt;&lt;br/&gt;
&lt;strong&gt;RAM&lt;/strong&gt;: &lt;a href="https://www.gskill.com/product/165/390/1665020865/F5-6000J3040G32GX2-TZ5NR" target="_blank" rel="noreferrer"&gt;G.SKILL Trident Z5 Neo RGB 64GB DDR5-6000&lt;/a&gt;&lt;br/&gt;
&lt;strong&gt;PSU&lt;/strong&gt;: &lt;a href="https://www.corsair.com/uk/en/p/psu/cp-9020259-uk/hx1000i-fully-modular-ultra-low-noise-platinum-atx-1000-watt-pc-power-supply-cp-9020259-uk" target="_blank" rel="noreferrer"&gt;Corsair HX1000i&lt;/a&gt;&lt;br/&gt;
&lt;strong&gt;Disk&lt;/strong&gt;: &lt;a href="https://www.westerndigital.com/products/internal-drives/wd-black-sn850x-nvme-ssd?sku=WDS100T2X0E" target="_blank" rel="noreferrer"&gt;1TB SN850X&lt;/a&gt; + &lt;a href="https://www.westerndigital.com/products/internal-drives/wd-black-sn850x-nvme-ssd?sku=WDS200T2X0E" target="_blank" rel="noreferrer"&gt;2TB SN850X&lt;/a&gt;&lt;br/&gt;
&lt;strong&gt;Board&lt;/strong&gt;: &lt;a href="https://www.msi.com/Motherboard/MPG-X670E-CARBON-WIFI" target="_blank" rel="noreferrer"&gt;MSI MPG X670E CARBON WIFI&lt;/a&gt;&lt;br/&gt;
&lt;strong&gt;Cooler&lt;/strong&gt;: &lt;a href="https://www.bequiet.com/en/cpucooler/4466" target="_blank" rel="noreferrer"&gt;beQuiet Dark Rock Pro 5&lt;/a&gt;&lt;br/&gt;
&lt;strong&gt;Case&lt;/strong&gt;: &lt;a href="https://www.bequiet.com/en/case/1501" target="_blank" rel="noreferrer"&gt;beQuiet Silent Base 600&lt;/a&gt; with 3x &lt;a href="https://www.bequiet.com/en/casefans/3703" target="_blank" rel="noreferrer"&gt;beQuiet Silent Wings 4 PWM&lt;/a&gt; fans&lt;br/&gt;
&lt;strong&gt;Keyboard&lt;/strong&gt;: &lt;a href="https://www.durgod.com/product/k320-space-gray/" target="_blank" rel="noreferrer"&gt;DURGOD Taurus K320 TKL&lt;/a&gt; with Cherry MX Brown switches&lt;br/&gt;
&lt;strong&gt;Mouse&lt;/strong&gt;: &lt;a href="https://www.razer.com/ap-en/gaming-mice/razer-deathadder-v2-pro" target="_blank" rel="noreferrer"&gt;Razer Deathadder V2 Pro&lt;/a&gt;&lt;br/&gt;
&lt;strong&gt;Monitor&lt;/strong&gt;: &lt;a href="https://www.samsung.com/uk/monitors/gaming/odyssey-neo-g9-g95nc-57-inch-240hz-curved-dual-uhd-ls57cg952nuxxu/" target="_blank" rel="noreferrer"&gt;57&amp;quot; Samsung G95NC Odessey Neo G9&lt;/a&gt;&lt;br/&gt;
&lt;strong&gt;Camera&lt;/strong&gt;: &lt;a href="https://www.sony.co.uk/interchangeable-lens-cameras/products/ilme-fx3-body---kit" target="_blank" rel="noreferrer"&gt;Sony ILME-FX3&lt;/a&gt; / &lt;a href="https://www.sony.co.uk/electronics/camera-lenses/sel2870" target="_blank" rel="noreferrer"&gt;FE 28-70mm F3.5-5.6&lt;/a&gt; / &lt;a href="https://www.elgato.com/uk/en/p/cam-link-4k" target="_blank" rel="noreferrer"&gt;Elgato Cam Link 4K&lt;/a&gt;&lt;br/&gt;
&lt;strong&gt;Speakers&lt;/strong&gt;: &lt;a href="https://audioengineeu.com/products/audioengine-a2-wireless-bluetooth-computer-speakers-60w-bluetooth-speaker-system-for-home-studio-gaming" target="_blank" rel="noreferrer"&gt;Audioengine A2+&lt;/a&gt;&lt;br/&gt;
&lt;strong&gt;Mic&lt;/strong&gt;: &lt;a href="https://rode.com/en/microphones/on-camera/videomic-go-ii" target="_blank" rel="noreferrer"&gt;RODE VideoMic GO II&lt;/a&gt;&lt;br/&gt;&lt;/p&gt;
&lt;p&gt;On my desk, you&amp;rsquo;ll find a &lt;a href="https://www.samsung.com/uk/monitors/gaming/odyssey-neo-g9-g95nc-57-inch-240hz-curved-dual-uhd-ls57cg952nuxxu/" target="_blank" rel="noreferrer"&gt;57&amp;quot; Samsung G95NC Odessey Neo G9&lt;/a&gt; monitor mounted on a &lt;a href="https://www.amazon.co.uk/gp/product/B0B73XXDP5/ref=ppx_yo_dt_b_search_asin_title?ie=UTF8&amp;amp;psc=1" target="_blank" rel="noreferrer"&gt;gas spring arm&lt;/a&gt;, which is the newest addition to my setup. For 5 years, I&amp;rsquo;d been running a pair of 27&amp;quot; &lt;a href="https://www.lg.com/us/monitors/lg-27un850-w-4k-uhd-led-monitor" target="_blank" rel="noreferrer"&gt;LG 27&amp;quot; UN850 4K&lt;/a&gt; monitors mounted on a dual monitor arm and had toyed with the idea of moving to an ultra-wide for a while. The Samsung display is the first I have found that doesn&amp;rsquo;t compromise on resolution - it&amp;rsquo;s the same resolution as my two LG monitors combined, but on a single panel. I must admit that I&amp;rsquo;m quite surprised how much of a productivity booster it is &lt;em&gt;not&lt;/em&gt; having the split down the middle.&lt;/p&gt;
&lt;p&gt;&lt;a href="01.png"&gt;
&lt;figure&gt;
&lt;picture
class="mx-auto my-0 rounded-md"
&gt;
&lt;source
srcset="https://jnsgr.uk/2024/07/how-i-computer-in-2024/01_hu_d086f5b7eb8785bb.webp 330w,https://jnsgr.uk/2024/07/how-i-computer-in-2024/01_hu_afa6804c56494bde.webp 660w
,https://jnsgr.uk/2024/07/how-i-computer-in-2024/01_hu_82aee2c8b3250c73.webp 1024w
,https://jnsgr.uk/2024/07/how-i-computer-in-2024/01_hu_cffccf31f5645789.webp 1320w
"
sizes="100vw"
type="image/webp"
/&gt;
&lt;img
width="1600"
height="900"
class="mx-auto my-0 rounded-md"
alt="a photograph of my desk including a huge ultra-wide monitor"
loading="lazy" decoding="async"
src="https://jnsgr.uk/2024/07/how-i-computer-in-2024/01_hu_5d49891b975005ae.png" srcset="https://jnsgr.uk/2024/07/how-i-computer-in-2024/01_hu_d6a0a234c7ef3c2d.png 330w,https://jnsgr.uk/2024/07/how-i-computer-in-2024/01_hu_5d49891b975005ae.png 660w
,https://jnsgr.uk/2024/07/how-i-computer-in-2024/01_hu_bc0ce5a0d6ba62ed.png 1024w
,https://jnsgr.uk/2024/07/how-i-computer-in-2024/01_hu_bcb6679a926b0a7c.png 1320w
"
sizes="100vw"
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;At the time of writing, I work for &lt;a href="https://canonical.com" target="_blank" rel="noreferrer"&gt;Canonical&lt;/a&gt; which is an all remote company. The combination of the company itself and my role as VP Engineering means I spend a good portion of my day on video calls. In my opinion, investing in a solid AV setup is a service to your colleagues, particularly where your role involves managing people. I&amp;rsquo;m currently running a &lt;a href="https://www.sony.co.uk/interchangeable-lens-cameras/products/ilme-fx3-body---kit" target="_blank" rel="noreferrer"&gt;Sony ILME-FX3&lt;/a&gt; with the standard &lt;a href="https://www.sony.co.uk/electronics/camera-lenses/sel2870" target="_blank" rel="noreferrer"&gt;FE 28-70mm F3.5-5.6&lt;/a&gt; lens, hooked up to an &lt;a href="https://www.elgato.com/uk/en/p/cam-link-4k" target="_blank" rel="noreferrer"&gt;Elgato Cam Link 4K&lt;/a&gt;. For audio, I use a &lt;a href="https://rode.com/en/microphones/on-camera/videomic-go-ii" target="_blank" rel="noreferrer"&gt;RODE VideoMic GO II&lt;/a&gt; and a pair of &lt;a href="https://audioengineeu.com/products/audioengine-a2-wireless-bluetooth-computer-speakers-60w-bluetooth-speaker-system-for-home-studio-gaming" target="_blank" rel="noreferrer"&gt;Audioengine A2+&lt;/a&gt; speakers.&lt;/p&gt;
&lt;p&gt;In the world of Linux desktops, I&amp;rsquo;ve found audio devices that present their own USB interface to be much less hassle. I completely disable the motherboard&amp;rsquo;s onboard sound, as well as the HDMI/DisplayPort sound outputs on my machine and leave just the USB audio interfaces from my mic and speakers enabled.&lt;/p&gt;
&lt;h3 id="server" class="relative group"&gt;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="#server" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h3&gt;&lt;p&gt;I use the term &amp;ldquo;server&amp;rdquo; loosely… my homelab has gone through many iterations over the years, from all &amp;ldquo;on-prem&amp;rdquo;, to a mix of cloud services and devices, and back again.&lt;/p&gt;
&lt;p&gt;My current setup is very modest, partly because my workstation is such a monster, meaning I can easily spin up multiple VMs/containers there when I want to experiment and not really impact the performance of the machine for more routine tasks.&lt;/p&gt;
&lt;p&gt;Most of my services run on a single &lt;a href="https://ark.intel.com/content/www/us/en/ark/products/89187/intel-nuc-kit-nuc6i7kyk.html" target="_blank" rel="noreferrer"&gt;Intel NUC6i7KYK&lt;/a&gt;. This machine has an Intel i7-6770HQ CPU, 16GB RAM and a 512GB Samsung 970 Pro NVMe drive internally. It&amp;rsquo;s connected to a Samsung 840 EVO 4TB SATA drive by USB. I&amp;rsquo;m not much of a data-hoarder so I don&amp;rsquo;t require too much storage.&lt;/p&gt;
&lt;p&gt;This machine is getting a bit tired and I&amp;rsquo;m thinking about replacing it with something a little more modern later this year.&lt;/p&gt;
&lt;h3 id="laptop" class="relative group"&gt;Laptop &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="#laptop" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h3&gt;&lt;p&gt;If I&amp;rsquo;m not at my desk, then I&amp;rsquo;m using my &lt;a href="https://www.lenovo.com/gb/en/p/laptops/thinkpad/thinkpadz/thinkpad-z13-%2813-inch-amd%29/len101t0036?srsltid=AfmBOor-8ic5yZrW3rlDXTTRwK8r05y-gjCpJK04fA4qtote0u2HZ7I6" target="_blank" rel="noreferrer"&gt;Lenovo Z13 Gen 1&lt;/a&gt;. I specified this machine with the AMD Ryzen 7 Pro 6860Z, 32GB RAM and a Hi-DPI display.&lt;/p&gt;
&lt;p&gt;I can&amp;rsquo;t rate this machine highly enough. The build quality is a cut above even Lenovo&amp;rsquo;s normal standard - it feels very premium and much more in the style of Apple&amp;rsquo;s uni-body aluminium laptops. It&amp;rsquo;s got plenty of power, and the battery lasts most of the day under moderate usage.&lt;/p&gt;
&lt;p&gt;I tend towards ultralight machines when I travel because I can always use my desktop machine remotely if I need more grunt (more on that later…), and I&amp;rsquo;m certainly not interested in trying to make dual integrated/discrete GPUs work properly.&lt;/p&gt;
&lt;h3 id="phone" class="relative group"&gt;Phone &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="#phone" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h3&gt;&lt;p&gt;I carry an &lt;a href="https://www.apple.com/uk/iphone-15-pro/" target="_blank" rel="noreferrer"&gt;Apple iPhone 15 Pro&lt;/a&gt;. I&amp;rsquo;ve been an iPhone user since around 2011 and likely won&amp;rsquo;t change any time soon. My family all use iPhones (and therefore FaceTime) and I like the particular trade-off of convenience/privacy that&amp;rsquo;s provided by Apple - however flawed that might be in absolute terms. The phone works great with my Airpods, the camera is better than I am at taking photos, and the battery life seems pretty good too.&lt;/p&gt;
&lt;p&gt;I wrap the phone in a &lt;a href="https://uk.mous.co/products/limitless-5-0-magsafe-compatible-phone-case-aramid_fibre" target="_blank" rel="noreferrer"&gt;Mous Limitless 5.0 Aramid Fibre&lt;/a&gt; case to avoid too many oops moments!&lt;/p&gt;
&lt;p&gt;I find it difficult to get too excited about phones these days, I see them more as a commodity.&lt;/p&gt;
&lt;h2 id="connectivity--security" class="relative group"&gt;Connectivity &amp;amp; Security &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="#connectivity--security" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;In 2021 I started using &lt;a href="https://tailscale.com/" target="_blank" rel="noreferrer"&gt;Tailscale&lt;/a&gt; in place of my hand-rolled Wireguard setup, and I haven&amp;rsquo;t looked back. It has to be one of my favourite pieces of technology ever. It runs on all of my things - desktops, laptops, servers, phones, tablets, etc.&lt;/p&gt;
&lt;p&gt;I also recently took advantage of their &lt;a href="https://tailscale.com/kb/1258/mullvad-exit-nodes" target="_blank" rel="noreferrer"&gt;partnership with Mullvad&lt;/a&gt;. I&amp;rsquo;ve used &lt;a href="https://mullvad.net/en" target="_blank" rel="noreferrer"&gt;Mullvad&lt;/a&gt; as my default VPN provider when using untrusted networks for a few years - but using it through Tailscale means I can still access my tailnet while my internet traffic egresses through Mullvad without any extra configuration.&lt;/p&gt;
&lt;p&gt;I use &lt;a href="https://nextdns.io/" target="_blank" rel="noreferrer"&gt;NextDNS&lt;/a&gt; as an alternative to running a &lt;a href="https://pi-hole.net/" target="_blank" rel="noreferrer"&gt;Pi-Hole&lt;/a&gt; or similar. Tailscale have a nice &lt;a href="https://tailscale.com/kb/1218/nextdns" target="_blank" rel="noreferrer"&gt;integration&lt;/a&gt; which means that all the devices on my tailnet automatically get &lt;a href="https://en.wikipedia.org/wiki/DNS_over_HTTPS" target="_blank" rel="noreferrer"&gt;DNS-over-HTTPS&lt;/a&gt; without any additional configuration, as well as DNS-level ad-blocking.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve got a couple of shared nodes in my tailnet - including one that my family can use as an exit node when they travel. As a result, I make quite extensive use of Tailscale &lt;a href="https://tailscale.com/kb/1018/acls" target="_blank" rel="noreferrer"&gt;ACLs&lt;/a&gt; to ensure people can only access what I want them to.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve been a &lt;a href="https://1password.com/" target="_blank" rel="noreferrer"&gt;1Password&lt;/a&gt; user for more than a decade now and I think their products are fantastic. Their Linux app sets the bar for modern cross-platform applications in my view. I recently started using their secrets capability at the CLI - the ability to store a &lt;code&gt;.env&lt;/code&gt; file with a bunch of benign secret references, and have the actual &lt;a href="https://developer.1password.com/docs/cli/secrets-scripts" target="_blank" rel="noreferrer"&gt;secrets injected into the environment&lt;/a&gt; or a &lt;a href="https://developer.1password.com/docs/cli/secrets-config-files" target="_blank" rel="noreferrer"&gt;config file&lt;/a&gt; is very handy.&lt;/p&gt;
&lt;p&gt;I also have a small collection of &lt;a href="https://www.yubico.com/products/yubikey-5-overview/" target="_blank" rel="noreferrer"&gt;Yubikeys&lt;/a&gt; with different connectors. One lives on my desk attached to my desktop, another lives in my pocket or otherwise on my person, and another is in a safe. They&amp;rsquo;re all NFC enabled so they work nicely with my mobile devices. I configure my Yubikeys with ed25519 &lt;a href="https://developers.yubico.com/SSH/Securing_git_with_SSH_and_FIDO2.html" target="_blank" rel="noreferrer"&gt;resident keys&lt;/a&gt; for SSH, along with storing my GPG key (which rarely gets used these days&amp;hellip;).&lt;/p&gt;
&lt;p&gt;One of my favourite things about the Yubikey is their ability to store TOTP codes. It&amp;rsquo;s a bit of a pain when I onboard a new account having to add the new secret to each key, but the upside is I don&amp;rsquo;t have to work out how to update/transfer them all each time I get a new phone! It&amp;rsquo;s also handy on the desktop to be able to run &lt;code&gt;ykman oath accounts code &amp;lt;name&amp;gt;&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id="productivity-apps" class="relative group"&gt;Productivity Apps &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="#productivity-apps" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;A lot of my work is done in a browser. Canonical uses &lt;a href="https://workspace.google.com/intl/en_uk/" target="_blank" rel="noreferrer"&gt;Google Workspace&lt;/a&gt; for emails, documents, slides, etc., so my default mode since joining has been to use Google Chrome for work things, and Firefox for personal things. I know that Firefox has &lt;a href="https://addons.mozilla.org/en-US/firefox/addon/multi-account-containers/" target="_blank" rel="noreferrer"&gt;Account Containers&lt;/a&gt; and other features that would help segregate the two, but I&amp;rsquo;ve found keeping my work and personal concerns in completely separate browsers to be useful.&lt;/p&gt;
&lt;p&gt;After having run a &lt;a href="https://nextcloud.com/" target="_blank" rel="noreferrer"&gt;Nextcloud&lt;/a&gt; server for several years on a Droplet (&lt;a href="https://github.com/jnsgruk/nextcloud-docker-compose" target="_blank" rel="noreferrer"&gt;using &lt;code&gt;docker-compose&lt;/code&gt;&lt;/a&gt;), I ultimately realised that I was &lt;em&gt;only&lt;/em&gt; using the file syncing capability, and wasn&amp;rsquo;t moving much data even then. I switched to using &lt;a href="https://syncthing.net/" target="_blank" rel="noreferrer"&gt;Syncthing&lt;/a&gt; to avoid the overhead of running a server instance, which works particularly well when combined with Tailscale.&lt;/p&gt;
&lt;p&gt;All of my notes, both work and personal, live in &lt;a href="https://obsidian.md/" target="_blank" rel="noreferrer"&gt;Obsidian&lt;/a&gt;. When I first discovered Obsidian I fell for the classic trick of installing &lt;strong&gt;all the extensions&lt;/strong&gt;, and have since paired that back. I went very deep with &lt;a href="https://blacksmithgu.github.io/obsidian-dataview/" target="_blank" rel="noreferrer"&gt;Dataview&lt;/a&gt;, using it to collate actions from across my vault into various categories (meeting agendas, personal, reviews, etc.), but I found that as my vault grew the performance suffered quite a lot. A few months ago, I removed dataview, did some painful refactoring of my notes (lots of &lt;code&gt;sed&lt;/code&gt;erry and &lt;code&gt;grep&lt;/code&gt;pery!) and reverted to using Obsidian&amp;rsquo;s &lt;a href="https://help.obsidian.md/Plugins/Search#Embed%20search%20results%20in%20a%20note" target="_blank" rel="noreferrer"&gt;embedded search queries&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I tried to get into &lt;a href="https://zettelkasten.de/introduction/" target="_blank" rel="noreferrer"&gt;Zettelkasten&lt;/a&gt; but found the maintenance a little&amp;hellip; boring? I&amp;rsquo;ve ended up with a simple structure that I find really helps me in my day-to-day at work. Each day gets its own &amp;ldquo;Daily Note&amp;rdquo; which includes my agenda, linking to ongoing notes with the people or regular meetings I&amp;rsquo;m in. The daily notes are also a place for me to collate loose notes which might be searched later:&lt;/p&gt;
&lt;p&gt;&lt;a href="02.png"&gt;
&lt;figure&gt;
&lt;picture
class="mx-auto my-0 rounded-md"
&gt;
&lt;source
srcset="https://jnsgr.uk/2024/07/how-i-computer-in-2024/02_hu_36c456e44671248d.webp 330w,https://jnsgr.uk/2024/07/how-i-computer-in-2024/02_hu_4261ec2f7b9c319d.webp 660w
,https://jnsgr.uk/2024/07/how-i-computer-in-2024/02_hu_351459cda373a59b.webp 1024w
,https://jnsgr.uk/2024/07/how-i-computer-in-2024/02_hu_92167cc4f39c1704.webp 1320w
"
sizes="100vw"
type="image/webp"
/&gt;
&lt;img
width="1360"
height="1077"
class="mx-auto my-0 rounded-md"
alt="obsidian.md screenshot showing my daily note template"
loading="lazy" decoding="async"
src="https://jnsgr.uk/2024/07/how-i-computer-in-2024/02_hu_917fffad5c2c26a4.png" srcset="https://jnsgr.uk/2024/07/how-i-computer-in-2024/02_hu_b24f528c7326236b.png 330w,https://jnsgr.uk/2024/07/how-i-computer-in-2024/02_hu_917fffad5c2c26a4.png 660w
,https://jnsgr.uk/2024/07/how-i-computer-in-2024/02_hu_2ec4c76d5f5911b5.png 1024w
,https://jnsgr.uk/2024/07/how-i-computer-in-2024/02_hu_c0443de8f91f42cb.png 1320w
"
sizes="100vw"
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The agenda and the links are automatically generated using a small Go application I wrote - this application scrapes my Google Calendar, and according to some rules and the knowledge it has of my vault, generates the Markdown for the agenda and copies it to the clipboard. Each day, I sit down and type &lt;code&gt;agenda&lt;/code&gt; at the command line, then paste into Obsidian. The notes for each person contain a running log of my notes with that person or group by date.&lt;/p&gt;
&lt;p&gt;I use a few Obsidian plugins to help here - including &lt;a href="https://github.com/SilentVoid13/Templater" target="_blank" rel="noreferrer"&gt;Templater&lt;/a&gt;, &lt;a href="https://github.com/chhoumann/quickadd" target="_blank" rel="noreferrer"&gt;QuickAdd&lt;/a&gt;, &lt;a href="https://github.com/scambier/obsidian-omnisearch" target="_blank" rel="noreferrer"&gt;Omnisearch&lt;/a&gt; and &lt;a href="https://github.com/platers/obsidian-linter" target="_blank" rel="noreferrer"&gt;Linter&lt;/a&gt;. The first two are particularly handy for quickly inserting common meeting agendas, sets of interview questions, playbooks, etc.&lt;/p&gt;
&lt;p&gt;I moved away from tracking tasks in Obsidian, and started using &lt;a href="https://todoist.com/" target="_blank" rel="noreferrer"&gt;Todoist&lt;/a&gt; late last year. Todoist is great - I like to keep running lists of tasks per person, so that when I next meet them in a 1:1 or otherwise, I have a quick reference of all the things I&amp;rsquo;m meant to speak with them about - and I can achieve that very easily with Todoist labels. The Obsidian integration means I can integrate the agenda with the meeting note for a specific person:&lt;/p&gt;
&lt;p&gt;&lt;a href="03.png"&gt;
&lt;figure&gt;
&lt;picture
class="mx-auto my-0 rounded-md"
&gt;
&lt;source
srcset="https://jnsgr.uk/2024/07/how-i-computer-in-2024/03_hu_f2eb061e2f274815.webp 330w,https://jnsgr.uk/2024/07/how-i-computer-in-2024/03_hu_db8c5e18d368880.webp 660w
,https://jnsgr.uk/2024/07/how-i-computer-in-2024/03_hu_f18872dc4431ff00.webp 1024w
,https://jnsgr.uk/2024/07/how-i-computer-in-2024/03_hu_241836378de466ba.webp 1320w
"
sizes="100vw"
type="image/webp"
/&gt;
&lt;img
width="2499"
height="1094"
class="mx-auto my-0 rounded-md"
alt="obsidian and todoist side-by-side showing the integration"
loading="lazy" decoding="async"
src="https://jnsgr.uk/2024/07/how-i-computer-in-2024/03_hu_67f3f065d3f6c0b8.png" srcset="https://jnsgr.uk/2024/07/how-i-computer-in-2024/03_hu_375a7f20cc31d276.png 330w,https://jnsgr.uk/2024/07/how-i-computer-in-2024/03_hu_67f3f065d3f6c0b8.png 660w
,https://jnsgr.uk/2024/07/how-i-computer-in-2024/03_hu_ce5423ecfd08d45d.png 1024w
,https://jnsgr.uk/2024/07/how-i-computer-in-2024/03_hu_aa06cb2a37009c4.png 1320w
"
sizes="100vw"
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="development" class="relative group"&gt;Development &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="#development" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;I&amp;rsquo;ve been a long-time user of &lt;a href="https://alacritty.org/" target="_blank" rel="noreferrer"&gt;Alacritty&lt;/a&gt; as a terminal emulator. I mostly use &lt;a href="https://code.visualstudio.com/" target="_blank" rel="noreferrer"&gt;Visual Studio Code&lt;/a&gt; on the desktop - I like the community support for plugins, themes, etc. I&amp;rsquo;m also pretty handy in vim - I still have quite a snazzy &lt;a href="https://neovim.io/" target="_blank" rel="noreferrer"&gt;Neovim&lt;/a&gt; setup which I use whenever I&amp;rsquo;m at the terminal. You can see my &lt;a href="https://github.com/jnsgruk/nixos-config/blob/main/home/common/shell/vim.nix" target="_blank" rel="noreferrer"&gt;neovim config&lt;/a&gt; on Github - I don&amp;rsquo;t go too wild on plugins, but I&amp;rsquo;ve come to like &lt;a href="https://github.com/itchyny/lightline.vim" target="_blank" rel="noreferrer"&gt;lightline&lt;/a&gt;, &lt;a href="https://github.com/nvim-telescope/telescope.nvim" target="_blank" rel="noreferrer"&gt;telescope&lt;/a&gt;, and &lt;a href="https://github.com/nvim-tree/nvim-tree.lua" target="_blank" rel="noreferrer"&gt;nvim-tree-lua&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href="04.png"&gt;
&lt;figure&gt;
&lt;picture
class="mx-auto my-0 rounded-md"
&gt;
&lt;source
srcset="https://jnsgr.uk/2024/07/how-i-computer-in-2024/04_hu_4e296dc1dc51fef2.webp 330w,https://jnsgr.uk/2024/07/how-i-computer-in-2024/04_hu_64bf18bb5448a8c6.webp 660w
,https://jnsgr.uk/2024/07/how-i-computer-in-2024/04_hu_7d188397ca7c7573.webp 1024w
,https://jnsgr.uk/2024/07/how-i-computer-in-2024/04_hu_420c274aec36aeeb.webp 1320w
"
sizes="100vw"
type="image/webp"
/&gt;
&lt;img
width="2035"
height="1231"
class="mx-auto my-0 rounded-md"
alt="the alacritty terminal emulator showing a tmux session with neovim loaded"
loading="lazy" decoding="async"
src="https://jnsgr.uk/2024/07/how-i-computer-in-2024/04_hu_c06d0df4afb272aa.png" srcset="https://jnsgr.uk/2024/07/how-i-computer-in-2024/04_hu_7d8d9746d1bfc261.png 330w,https://jnsgr.uk/2024/07/how-i-computer-in-2024/04_hu_c06d0df4afb272aa.png 660w
,https://jnsgr.uk/2024/07/how-i-computer-in-2024/04_hu_4ac5677691b9e4ad.png 1024w
,https://jnsgr.uk/2024/07/how-i-computer-in-2024/04_hu_a01d9d9a94198a79.png 1320w
"
sizes="100vw"
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I mostly drive &lt;code&gt;git&lt;/code&gt; from the command line, but I&amp;rsquo;ve recently taken to using &lt;a href="https://www.sublimemerge.com/" target="_blank" rel="noreferrer"&gt;Sublime Merge&lt;/a&gt; for complicated rebases, or where I want to stage lots of small hunks in files. I was a dedicated user of &lt;a href="https://www.sublimetext.com/" target="_blank" rel="noreferrer"&gt;Sublime Text&lt;/a&gt; for some years, but felt like it lagged behind Visual Studio Code on features after a while - despite being somewhat addicted to how lightning fast Sublime Text felt in comparison.&lt;/p&gt;
&lt;p&gt;&lt;a href="05.png"&gt;
&lt;figure&gt;
&lt;picture
class="mx-auto my-0 rounded-md"
&gt;
&lt;source
srcset="https://jnsgr.uk/2024/07/how-i-computer-in-2024/05_hu_30fc1daf73e4eb23.webp 330w,https://jnsgr.uk/2024/07/how-i-computer-in-2024/05_hu_79d9ee819eca0cd3.webp 660w
,https://jnsgr.uk/2024/07/how-i-computer-in-2024/05_hu_7bfe86df5dd0a20.webp 1024w
,https://jnsgr.uk/2024/07/how-i-computer-in-2024/05_hu_ef0c6e3633b7e20f.webp 1320w
"
sizes="100vw"
type="image/webp"
/&gt;
&lt;img
width="3128"
height="1335"
class="mx-auto my-0 rounded-md"
alt="visual studio code and sublime merge side-by-side"
loading="lazy" decoding="async"
src="https://jnsgr.uk/2024/07/how-i-computer-in-2024/05_hu_1d1bb9067b09700c.png" srcset="https://jnsgr.uk/2024/07/how-i-computer-in-2024/05_hu_7b1df3ee0ff0caf8.png 330w,https://jnsgr.uk/2024/07/how-i-computer-in-2024/05_hu_1d1bb9067b09700c.png 660w
,https://jnsgr.uk/2024/07/how-i-computer-in-2024/05_hu_cd2a454a51a75eba.png 1024w
,https://jnsgr.uk/2024/07/how-i-computer-in-2024/05_hu_1f3f2d4146c51859.png 1320w
"
sizes="100vw"
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="os--desktop" class="relative group"&gt;OS / Desktop &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="#os--desktop" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;If you&amp;rsquo;ve read my blog before, it&amp;rsquo;ll be no surprise to you that I&amp;rsquo;m all-in on NixOS for all the things. I started that journey around 2 years ago and haven&amp;rsquo;t looked back. My journey on the Linux desktop has been quite varied over the years: my first ever Linux desktop experience was with &lt;a href="https://www.knopper.net/knoppix/index-en.html" target="_blank" rel="noreferrer"&gt;Knoppix&lt;/a&gt; back in 2003. I then spent a few years dabbling with the various releases of Ubuntu before starting to use Linux on the desktop full-time in around 2014. From there I spent years on Arch Linux swapping between Plasma and GNOME about every 12 months.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve become a fairly dedicated tiling window manager user, though I&amp;rsquo;ll admit that I bounced off it a few times before it stuck. When I made the switch to &lt;a href="https://swaywm.org/" target="_blank" rel="noreferrer"&gt;Sway&lt;/a&gt; in 2021, something clicked and I&amp;rsquo;ve not gone back from tiling since. I stuck with Sway in various configurations for quite a while, before moving to an almost identical looking setup based on &lt;a href="https://hyprland.org/" target="_blank" rel="noreferrer"&gt;Hyprland&lt;/a&gt; around 15 months ago. Hyprland seems nice - it&amp;rsquo;s mostly stable and I like the eye-candy.&lt;/p&gt;
&lt;p&gt;Absolutely everything is themed with &lt;a href="https://github.com/catppuccin/catppuccin" target="_blank" rel="noreferrer"&gt;Catppuccin Macchiato&lt;/a&gt;. Not only do I love the theme, but I love how pervasive it is across all the apps/tools I use - and I&amp;rsquo;m a sucker for consistency!&lt;/p&gt;
&lt;p&gt;You can see all the gory details of my Hyprland, waybar, rofi, mako, etc. &lt;a href="https://github.com/jnsgruk/nixos-config" target="_blank" rel="noreferrer"&gt;on Github&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href="07.png"&gt;
&lt;figure&gt;
&lt;picture
class="mx-auto my-0 rounded-md"
&gt;
&lt;source
srcset="https://jnsgr.uk/2024/07/how-i-computer-in-2024/07_hu_7d32d2b40e44587b.webp 330w,https://jnsgr.uk/2024/07/how-i-computer-in-2024/07_hu_ec7076dcc777b9b8.webp 660w
,https://jnsgr.uk/2024/07/how-i-computer-in-2024/07_hu_3d18fb46f7d6b570.webp 1024w
,https://jnsgr.uk/2024/07/how-i-computer-in-2024/07_hu_71565ad53b95470e.webp 1320w
"
sizes="100vw"
type="image/webp"
/&gt;
&lt;img
width="7680"
height="2160"
class="mx-auto my-0 rounded-md"
alt="screenshot of a very busy hyprland desktop with editors, browsers, etc."
loading="lazy" decoding="async"
src="https://jnsgr.uk/2024/07/how-i-computer-in-2024/07_hu_dd42ae4b8c136bc4.png" srcset="https://jnsgr.uk/2024/07/how-i-computer-in-2024/07_hu_d936ca64c3e8317e.png 330w,https://jnsgr.uk/2024/07/how-i-computer-in-2024/07_hu_dd42ae4b8c136bc4.png 660w
,https://jnsgr.uk/2024/07/how-i-computer-in-2024/07_hu_ed045c2b6baf7da4.png 1024w
,https://jnsgr.uk/2024/07/how-i-computer-in-2024/07_hu_d5e154cb50b150a7.png 1320w
"
sizes="100vw"
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="server--homelab" class="relative group"&gt;Server / Homelab &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="#server--homelab" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;My server machine also runs NixOS, with a collection of media services and utilities. Where possible all of the services are run as &amp;ldquo;native&amp;rdquo; NixOS modules, with some running inside &lt;a href="https://www.freedesktop.org/software/systemd/man/latest/systemd-nspawn.html" target="_blank" rel="noreferrer"&gt;systemd-nspawn&lt;/a&gt; containers using the built-in language for &lt;a href="https://nixos.wiki/wiki/NixOS_Containers" target="_blank" rel="noreferrer"&gt;NixOS Containers&lt;/a&gt;. If I&amp;rsquo;m experimenting with a new service, I sometimes run them in Docker to start with, especially if there isn&amp;rsquo;t already a NixOS module and I want to decide whether or not to invest the time in writing one!&lt;/p&gt;
&lt;p&gt;I run &lt;a href="https://caddyserver.com/" target="_blank" rel="noreferrer"&gt;Caddy&lt;/a&gt; as a reverse proxy (&lt;a href="https://github.com/jnsgruk/nixos-config/commit/dffac1dc0635f377865bcdfc2349387d41fc965d" target="_blank" rel="noreferrer"&gt;recently switched&lt;/a&gt; from Traefik). It can &lt;a href="https://tailscale.com/kb/1190/caddy-certificates" target="_blank" rel="noreferrer"&gt;talk directly to the Tailscale daemon&lt;/a&gt; to issue LetsEncrypt certs for devices on your tailnet. This Caddy instance acts as a reverse proxy onto all the services running on the server, along with some other services on my home LAN, all over TLS. I tend to access each of these services through &lt;a href="https://gethomepage.dev/latest/" target="_blank" rel="noreferrer"&gt;Homepage&lt;/a&gt; (which I previously &lt;a href="https://jnsgr.uk/2024/03/a-homelab-dashboard-for-nixos/" target="_blank" rel="noreferrer"&gt;blogged about&lt;/a&gt;):&lt;/p&gt;
&lt;p&gt;&lt;a href="08.png"&gt;
&lt;figure&gt;
&lt;picture
class="mx-auto my-0 rounded-md"
&gt;
&lt;source
srcset="https://jnsgr.uk/2024/07/how-i-computer-in-2024/08_hu_afa1eb2de0032a2e.webp 330w,https://jnsgr.uk/2024/07/how-i-computer-in-2024/08_hu_c0ffd64a7716a7dc.webp 660w
,https://jnsgr.uk/2024/07/how-i-computer-in-2024/08_hu_4bcba8ba359a9d06.webp 1024w
,https://jnsgr.uk/2024/07/how-i-computer-in-2024/08_hu_2e7b132c3c891c9f.webp 1320w
"
sizes="100vw"
type="image/webp"
/&gt;
&lt;img
width="1430"
height="985"
class="mx-auto my-0 rounded-md"
alt="my personal dashboard using gethomepage.dev"
loading="lazy" decoding="async"
src="https://jnsgr.uk/2024/07/how-i-computer-in-2024/08_hu_200e83fbbc7dac8.png" srcset="https://jnsgr.uk/2024/07/how-i-computer-in-2024/08_hu_57dbc59186fd3f04.png 330w,https://jnsgr.uk/2024/07/how-i-computer-in-2024/08_hu_200e83fbbc7dac8.png 660w
,https://jnsgr.uk/2024/07/how-i-computer-in-2024/08_hu_fb506dc413afb23.png 1024w
,https://jnsgr.uk/2024/07/how-i-computer-in-2024/08_hu_fd7b04bbbe5adaa7.png 1320w
"
sizes="100vw"
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Each night, the contents of my iCloud Photos library is dumped using &lt;a href="https://github.com/icloud-photos-downloader/icloud_photos_downloader" target="_blank" rel="noreferrer"&gt;icloud-photos-downloader&lt;/a&gt; so that I have a local (and backed up) copy of my photos should anything untoward ever happen to my iCloud account.&lt;/p&gt;
&lt;p&gt;It also runs a &lt;a href="https://www.home-assistant.io/" target="_blank" rel="noreferrer"&gt;Home Assistant&lt;/a&gt; instance which runs my (in-progress!) custom integration for the underfloor heating and solar inverter in my house. I haven&amp;rsquo;t yet spent enough time with Home Assistant, but I plan to get it better set up over the coming months. I recently moved to a house with lots of &amp;ldquo;smart&amp;rdquo; devices, and I&amp;rsquo;d like to bring control of all the various devices into a single application. Once my experimenting is done, I&amp;rsquo;ll probably move the Home Assistant deployment to a dedicated low-power device.&lt;/p&gt;
&lt;p&gt;This machine&amp;rsquo;s data is backed up nightly to &lt;a href="https://www.borgbase.com/" target="_blank" rel="noreferrer"&gt;Borgbase&lt;/a&gt;. As mentioned above, I use &lt;a href="https://syncthing.net/" target="_blank" rel="noreferrer"&gt;Syncthing&lt;/a&gt; to move files around, and I configure this server to act as a &amp;ldquo;receive only&amp;rdquo; target for all the directories that I sync. This means that my data is always in at least three places: on my desktop or laptop, on my server, and backed up to Borgbase. Sometimes I&amp;rsquo;ll ad-hoc access files that aren&amp;rsquo;t synced to a given machine using &lt;a href="https://www.files.gallery/" target="_blank" rel="noreferrer"&gt;Files&lt;/a&gt;, which is a nice looking, single PHP-file gallery for your files. I keep meaning to replace this with something that &lt;em&gt;isn&amp;rsquo;t PHP&lt;/em&gt;, but I&amp;rsquo;ve yet to find a more compelling blend of simplicity and compelling user experience.&lt;/p&gt;
&lt;h2 id="summary" class="relative group"&gt;Summary &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="#summary" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;I don&amp;rsquo;t know how many other people are interested in how other people use their computers - but I hope you enjoyed the article. Feel free to reach out if you think I could be doing something better, or if you think you&amp;rsquo;ve got a killer app I might enjoy using!&lt;/p&gt;</description></item></channel></rss>