<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Uses on Jon Seager</title><link>https://jnsgr.uk/tags/uses/</link><description>Recent content in Uses on Jon Seager</description><generator>Hugo -- gohugo.io</generator><language>en</language><lastBuildDate>Tue, 24 Jun 2025 00:00:00 +0000</lastBuildDate><atom:link href="https://jnsgr.uk/tags/uses/index.xml" rel="self" type="application/rss+xml"/><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>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>