<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet href="/feeds.xsl" type="text/xsl"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:base="https://chameth.com/">
    <title>Chameth.com - posts like building-a-new-computer, securing-all-the-things-with-1password, why-you-should-be-using-https but not debugging-beyond-the-debugger, sense-api</title>
    <subtitle>Personal homepage of Chris Smith</subtitle>
    <link href="https://chameth.com/feeds/posts/like/building-a-new-computer,securing-all-the-things-with-1password,why-you-should-be-using-https/unlike/debugging-beyond-the-debugger,sense-api/" rel="self"/>
    <link href="https://chameth.com/"/>
    <icon>https://chameth.com/favicon.png</icon>
    <updated>2025-11-26T00:00:00Z</updated>
    <id>https://chameth.com/</id>
    <author>
        <name>Chris Smith</name>
    </author>
    <entry>
        <title>Securing all the things with 1Password</title>
        <link href="https://chameth.com/securing-all-the-things-with-1password/"/>
        <updated>2025-11-26T00:00:00Z</updated>
        <id>https://chameth.com/securing-all-the-things-with-1password/</id>
        <content xml:lang="en" type="html">&lt;p&gt;For many years I’ve been a keen user of &lt;a href=&#34;https://bitwarden.com/&#34;&gt;Bitwarden&lt;/a&gt;. Recently I’ve had a lot of small paper-cut problems. The browser extension was redesigned and just doesn’t quite work how I expect any more. The prompt to save new login info misfired more than it worked. The mobile app stopped background refreshing properly. No one issue was enough to make me want to leave Bitwarden, but it definitely wasn’t sparking joy. Then there were rumblings about a price increase. I don’t think they’ve announced anything, but the numbers I saw were a jump from $10/year to $24/year. A nearly 2.5x price increase for a tool that was actively getting worse over time did not seem like a good deal to me&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a class=&#34;footnote-ref&#34; href=&#34;#fn:1&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;.&lt;/p&gt;
&lt;p&gt;I spent a while looking at alternatives, but there were very few that met my needs. &lt;a href=&#34;https://nordpass.com/&#34;&gt;Nordpass&lt;/a&gt; is highly praised but doesn’t support saving TOTP codes on personal plans&lt;sup id=&#34;fnref:2&#34;&gt;&lt;a class=&#34;footnote-ref&#34; href=&#34;#fn:2&#34; role=&#34;doc-noteref&#34;&gt;2&lt;/a&gt;&lt;/sup&gt;. All the nice open-source/self-hosted solutions fall down when you want reliable synchronisation to an iOS device (which is fair enough). &lt;a href=&#34;https://proton.me/pass&#34;&gt;Proton Pass&lt;/a&gt; looked like it had all the features, but the pricing was asinine. Different pages showed different prices, the prices were introductory rates that jumped up on renewal, but that was hidden away in small print, etc. Yuck. The prices are also pretty high. More or less the same as &lt;a href=&#34;https://1password.com/&#34;&gt;1Password&lt;/a&gt;, which I’d been discounting due to the cost, until now…&lt;/p&gt;
&lt;p&gt;After eliminating basically every other option, I took a serious look at 1Password. It seemed to tick all the right boxes, I’d often heard good things about it, and it wouldn’t actually be much more expensive than Bitwarden if they went ahead with the rumoured price increase. I started a trial to give it a test.&lt;/p&gt;
&lt;h3 id=&#34;initial-impressions&#34;&gt;Initial impressions&lt;/h3&gt;
&lt;p&gt;1Password is — as you’d expect for something that originated as a Mac app — very pretty. But it’s also highly functional. The looks don’t get in the way, they’re nice extras on top. When it’s locked, you get a large version of the 1Password logo, which is a front-on view of the barrel of a lock, next to the password input. When you authenticate, the barrel turns as though you’d put a key in and rotated it, and then the background splits in two and opens like a vault door. Does a password manager need to do that? No. Does it make me a little bit happy every time I see it? Yes. Look at it, it’s amazing!&lt;/p&gt;
&lt;figure class=&#34;video full&#34;&gt;
  &lt;video src=&#34;https://chameth.com/securing-all-the-things-with-1password/1password-vault-opening.webm&#34; alt=&#34;Video of the 1Password app, showing the lock screen. As the password is submitted, the key barrel rotates, and the background parts like a vault opening.&#34; controls=&#34;&#34;&gt;&lt;/video&gt;
&lt;/figure&gt;
&lt;p&gt;The design philosophy carries through the rest of the app. Despite using Bitwarden daily, I often clicked on the wrong thing when I wanted to do anything other than autofill; in about a month of using 1Password I don’t think I’ve ever misclicked or been confused about the UI. The browser extension just &lt;em&gt;feels&lt;/em&gt; snappier than Bitwarden, too. I’m not sure if it’s actually faster or if the design just makes it feel that way.&lt;/p&gt;
&lt;p&gt;Functionality-wise, 1Password does everything Bitwarden did for me but slightly better. Bitwarden kicked you to its web interface for some operations (like checking compromised passwords); 1Password has that all built into the app. Instead of editing entries in a fiddly little browser popup, 1Password just summons forth the desktop app and you edit it there. It does a good job of detecting QR codes for TOTPs and offering to save them. I think the only small complaint I have is that the browser extension doesn’t have an autofill keybind. You can rig that up via the desktop app, but it feels like 1Password leans towards you using the UI it adds on login forms. To be fair, that UI works really well, and is very useful when you have multiple accounts on a site. My muscle memory for autofilling is strong, though.&lt;/p&gt;
&lt;h3 id=&#34;diving-deeper&#34;&gt;Diving deeper&lt;/h3&gt;
&lt;p&gt;At this point I’d decided to switch fully to 1Password, so I started digging into what else it could do. The “Watchtower” feature combines a bunch of reporting about passwords (weak, breached, reused, and so on), but also lists sites where 1Password knows you can use passkeys or 2FA and don’t have them set up. I’d previously disabled passkey support in Bitwarden because it just appeared one day and got in the way of me trying to use a YubiKey, but decided to give them a go with 1Password. “Passkeys” is basically just a marketing term for FIDO2’s WebAuthn with automatic discovery bolted on top. The big problem is how you synchronise or export them. It’s all well and good letting your iPhone create a passkey when the Amazon app arbitrarily prompts it to, but what happens when you log in on a different device, or swap to Android, or whatever? Having 1Password deal with them fixes that&lt;sup id=&#34;fnref:3&#34;&gt;&lt;a class=&#34;footnote-ref&#34; href=&#34;#fn:3&#34; role=&#34;doc-noteref&#34;&gt;3&lt;/a&gt;&lt;/sup&gt;.&lt;/p&gt;
&lt;p&gt;The passkey flow is very smooth: 1Password pops up an account selector, with obvious options to create a new account or pass the request through to another device like a YubiKey. It’s smart enough to guess the right account most times, even when you’ve got 17 different Google accounts for &lt;code&gt;$reasons&lt;/code&gt;. Using them is equally simple: it just shows a popup and you tap to confirm you want to use the passkey. The Watchtower functionality made it really easy to go through and add passkeys everywhere that supports them. The thing I really appreciate is that they make the data that powers it &lt;a href=&#34;https://passkeys.directory/&#34;&gt;public&lt;/a&gt;. It’s obviously partially a marketing thing for them, but it’s also a useful resource they could have kept proprietary.&lt;/p&gt;
&lt;p&gt;Passkeys are a bit basic, though. 1Password has many more fun offerings. There’s an entire developer section with various goodies. At first I thought “that’s nice but I won’t use it”, but now I’m using basically everything it offers. The first thing to draw me in was the CLI. It’s pretty straightforward, but like the browser extensions it can nicely integrate with the desktop app so you unlock them all at once, deal with auth prompts in the GUI, and so forth. I have a couple of command-line tools that need passwords (e.g. for dealing with encrypted backups); now instead of prompting for the passwords, they shell out to &lt;code&gt;op read&lt;/code&gt; and I authorise it via a popup in the 1Password app. Simple, but a nice quality of life improvement.&lt;/p&gt;
&lt;p&gt;Next up there’s a beta feature called “Environments”. This lets you define groups of environment variables within 1Password, and have them exported automatically to certain destinations. At the minute it supports exporting to the AWS SecretsManager, and local &lt;code&gt;.env&lt;/code&gt; files. When making a local file it actually makes a named pipe, so the credentials aren’t just sitting on disk (and won’t end up accidentally committed to anything). When the 1Password vault is locked, anything trying to read from the file will cause an authentication popup, much like with the CLI tool. I used to have the mentality that if something could read arbitrary files on disk, it was basically “game over” from a security point of view. &lt;a href=&#34;https://www.bleepingcomputer.com/news/security/shai-hulud-malware-infects-500-npm-packages-leaks-secrets-on-github/&#34;&gt;Recent events&lt;/a&gt; made me realise there’s some value in defence-in-depth there, though, and 1Password provides a nice solution.&lt;/p&gt;
&lt;h3 id=&#34;fingerprints--linux--sadness&#34;&gt;Fingerprints + Linux = Sadness&lt;/h3&gt;
&lt;p&gt;One feature of 1Password had me feeling a bit left out. Instead of entering your vault password to unlock it every time, you can have it invoke the system authentication library. On an iPhone this uses Face ID, on a Mac it can invoke Touch ID, and on Linux it uses Polkit. In the default configuration, Polkit just asks for your local user password, which is not much of an improvement. A fingerprint scanner seemed like the obvious solution here: it’s both a lot more convenient than typing a long password, and provides some assurance that it’s actually me doing the action&lt;sup id=&#34;fnref:4&#34;&gt;&lt;a class=&#34;footnote-ref&#34; href=&#34;#fn:4&#34; role=&#34;doc-noteref&#34;&gt;4&lt;/a&gt;&lt;/sup&gt;. Unfortunately, fingerprint readers on Linux seem to be a bit of a sorry affair.&lt;/p&gt;
&lt;p&gt;Don’t get me wrong: there’s support. &lt;code&gt;libfprint&lt;/code&gt; has &lt;a href=&#34;https://fprint.freedesktop.org/supported-devices.html&#34;&gt;a big list of supported devices&lt;/a&gt;, but I found it almost impossible to actually find a device I could buy that had one of the listed sensors. Most of them seem to be exclusively built into laptops. A lot of the cheaper devices just use whatever sensor they can get their hands on, so it’s pot luck if you receive a version that will work with &lt;code&gt;libfprint&lt;/code&gt; or one that won’t. There’s also not a lot of information beyond that published by &lt;code&gt;libfprint&lt;/code&gt;. I guess it makes sense: external fingerprint readers just aren’t a thing most people care about. While that makes me feel all special, it’s somewhat prohibitive to getting an actual working solution.&lt;/p&gt;
&lt;p&gt;I’d given up on finding an answer to this when I stumbled upon &lt;a href=&#34;https://scottstuff.net/posts/2025/07/04/passwordless-ssh-and-sudo-with-1password/&#34;&gt;an article by Scott Laird&lt;/a&gt;. He uses a &lt;a href=&#34;https://www.yubico.com/products/yubikey-bio-series/&#34;&gt;YubiKey Bio&lt;/a&gt; to do it, via &lt;code&gt;pam_u2f&lt;/code&gt;. The Bio isn’t actually a fingerprint reader: it just has an on-board reader to secure the credentials. The OS doesn’t get involved in the process. But because it can provide a fingerprint-secured U2F key, and &lt;code&gt;pam_u2f&lt;/code&gt; can require that key to perform system operations, you basically get the same result. Maybe it’s actually even better than using a “real” fingerprint reader, as the data is secured on the hardware device…&lt;/p&gt;
&lt;p&gt;The YubiKey Bio was a bit more pricey than I really wanted, coming in at around £90, but it felt like a worthy investment to add a bit of security and avoid typing a password dozens of times a day. The setup was simple: the official app that you use to enrol fingerprints is packaged in the Arch User Repository, and it worked perfectly. I already had &lt;code&gt;pam_u2f&lt;/code&gt; set up as I used a (non-Bio) YubiKey to gate access to &lt;code&gt;sudo&lt;/code&gt;, so I just generated a new key on the Bio, updated my config to use that, and added it to the Polkit policy. Now when I need to unlock 1Password or authenticate something, it prompts me to scan my fingerprint. Perfect!&lt;/p&gt;
&lt;aside class=&#34;update raised-box&#34;&gt;
  &lt;h5 class=&#34;plain-header&#34;&gt;Update 2026-01-14:&lt;/h5&gt;
  &lt;p&gt;I used the YubiKey Bio for about a month, but I found it was a bit too rough for something I used so frequently. It would occasionally fail to read my fingerprints, and there’s no way to retry because of the massive indirection of polkit + pam + u2f. Even worse, it would sometimes fail enough times in a row that it’d lock itself, and have to be unlocked by opening the software. The Bio would be fine for securing something you used once or twice a day, but it’s not really a good alternative for a fingerprint reader you want to use on every git commit, SSH connection, desktop unlock, etc. It’s not a failure of the product, more of the usecase I tried to wrench it into.&lt;/p&gt;
&lt;/aside&gt;
&lt;h3 id=&#34;biometric-all-the-things-o&#34;&gt;Biometric all the things \o/&lt;/h3&gt;
&lt;p&gt;One of the other things Scott mentioned in that article was SSH keys. I’d seen 1Password supports acting as an SSH agent, but didn’t really see why I’d want it to. I used a resident key on my old YubiKey, so I didn’t have much to gain from a security point of view. Scott’s article made me realise I could have some big convenience gains, though. Currently every time I need to use the key, I enter a PIN and then physically touch it. I don’t mind this for the most part, but it turns out &lt;code&gt;git-lfs&lt;/code&gt; does something like four different requests every time you do a git operation, none of which reuse the same SSH connection for some reason. That gets painful when each request involves a PIN and a touch. I also liked the idea of using &lt;code&gt;pam_rssh&lt;/code&gt; for &lt;code&gt;sudo&lt;/code&gt; authentication, but didn’t want to have to do the PIN-and-touch dance every time I used it.&lt;/p&gt;
&lt;p&gt;You can probably see where this is going: I generated an SSH key in 1Password, and then… spent literal hours disabling all the other SSH agents that were running on my system, and trying to figure out where &lt;code&gt;SSH_AUTH_SOCK&lt;/code&gt; was being populated. I didn’t manage to figure that out in the end&lt;sup id=&#34;fnref:5&#34;&gt;&lt;a class=&#34;footnote-ref&#34; href=&#34;#fn:5&#34; role=&#34;doc-noteref&#34;&gt;5&lt;/a&gt;&lt;/sup&gt;, and ended up just overriding it to point at 1Password’s agent socket. I added the new key to GitHub, and did the usual &lt;code&gt;ssh git@github.com&lt;/code&gt; test, and it worked perfectly. 1Password prompts to allow access to the key, showing the process requesting access, and authorising it requires a fingerprint read:&lt;/p&gt;
&lt;figure class=&#34;image center&#34;&gt;
  &lt;picture&gt;
      &lt;source srcset=&#34;https://chameth.com/securing-all-the-things-with-1password/1password-access.webp&#34; type=&#34;image/webp&#34;/&gt;
      &lt;source srcset=&#34;https://chameth.com/securing-all-the-things-with-1password/1password-access.avif&#34; type=&#34;image/avif&#34;/&gt;
      &lt;img src=&#34;https://chameth.com/securing-all-the-things-with-1password/1password-access.png&#34; alt=&#34;1Password dialog showing Kitty requesting access to the &amp;#34;Git&amp;#34; SSH key. There are &amp;#34;Deny&amp;#34; and &amp;#34;Authorise&amp;#34; buttons at the bottom; the authorise button has a fingerprint icon on it.&#34; loading=&#34;lazy&#34; width=&#34;412&#34; height=&#34;381&#34;/&gt;
  &lt;/picture&gt;
  &lt;figcaption&gt;&lt;p&gt;can haz ssh key?&lt;/p&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;I’m not sure why Kitty doesn’t get an icon in the prompt; other applications do. You can expand the details section to see the key fingerprint being requested, as well as the exact process name and PID requesting the key. With the proof of concept done, I generated a couple more keys: one for normal SSH, and one for gaining root access using &lt;code&gt;pam_rssh&lt;/code&gt;. Using different keys ensures I get prompted for them separately, and means a malicious app couldn’t sneakily ask for a Git key but actually pivot to SSH into a server. Not sure that’s ever likely to be a problem, but it’s basically no additional work for a bit more defence-in-depth, so why not?&lt;/p&gt;
&lt;p&gt;I also took a moment to configure &lt;code&gt;pam_u2f&lt;/code&gt; for both &lt;code&gt;lightdm&lt;/code&gt; and &lt;code&gt;xfce4-screensaver&lt;/code&gt;, so I can now log in and unlock my PC with my fingerprint. It’s not quite as smooth as Touch ID on a Mac, but it’s pretty close.&lt;/p&gt;
&lt;div class=&#34;footnotes&#34; role=&#34;doc-endnotes&#34;&gt;
&lt;hr/&gt;
&lt;ol&gt;
&lt;li id=&#34;fn:1&#34;&gt;
&lt;p&gt;As an aside: this is not the first time I’ve been in this situation. Both Spotify and Todoist have focused on features I don’t want or need (including, but not limited to, pretty much everything branded “AI”), and then hiked the price up afterwards. It’s not quite standard enshittification, but it’s clear that our incentives no longer align properly. &lt;a class=&#34;footnote-backref&#34; href=&#34;#fnref:1&#34; role=&#34;doc-backlink&#34;&gt;↩︎&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&#34;fn:2&#34;&gt;
&lt;p&gt;Or didn’t, at the time I looked. It now says “All plans” on the website but the docs only exist for business accounts, and there doesn’t seem to be any announcement explaining the change. &lt;a class=&#34;footnote-backref&#34; href=&#34;#fnref:2&#34; role=&#34;doc-backlink&#34;&gt;↩︎&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&#34;fn:3&#34;&gt;
&lt;p&gt;Having Bitwarden deal with them would also have fixed that, but it got in my way instead of helping me, so… &lt;a class=&#34;footnote-backref&#34; href=&#34;#fnref:3&#34; role=&#34;doc-backlink&#34;&gt;↩︎&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&#34;fn:4&#34;&gt;
&lt;p&gt;or it’s not me, but I’ll be busy dealing with the presumably-undesired removal of one of my digits, so probably won’t care about whatever is happening on the computer. &lt;a class=&#34;footnote-backref&#34; href=&#34;#fnref:4&#34; role=&#34;doc-backlink&#34;&gt;↩︎&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&#34;fn:5&#34;&gt;
&lt;p&gt;Although I’m pretty sure the answer starts and ends with “systemd, somehow”. &lt;a class=&#34;footnote-backref&#34; href=&#34;#fnref:5&#34; role=&#34;doc-backlink&#34;&gt;↩︎&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
</content>
    </entry>
    <entry>
        <title>Fixing a loud PSU fan without dying</title>
        <link href="https://chameth.com/fixing-a-loud-psu-fan-without-dying/"/>
        <updated>2025-07-30T00:00:00Z</updated>
        <id>https://chameth.com/fixing-a-loud-psu-fan-without-dying/</id>
        <content xml:lang="en" type="html">&lt;p&gt;Three months after I &lt;a href=&#34;https://chameth.com/building-a-new-computer/&#34;&gt;built my new computer&lt;/a&gt;, it
started annoying me. There would occasionally be a noise that sounded like
a fan was catching on a cable, but there weren’t any loose cables to be a
problem. Over the course of a few weeks, the sound got progressively worse
to the extent that I didn’t want to use the computer without headphones on.
I measured the sound at 63 dB, which is about the sound of someone talking.
That may not sound terrible, but it’s a constant, nasty noise coming from
something that sits about 40cm from my head.&lt;/p&gt;
&lt;p&gt;After some investigating&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a class=&#34;footnote-ref&#34; href=&#34;#fn:1&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;, I identified the PSU fan as the culprit. I have
a Cooler Master V750 SFX, which is not super high-end, but wasn’t cheap, either.
It shouldn’t be developing issues after three months. Thankfully, it comes with
a ten-year warranty, so it should be easy to get sorted, right?&lt;/p&gt;
&lt;h3 id=&#34;warranty-woes&#34;&gt;Warranty woes&lt;/h3&gt;
&lt;p&gt;I looked at Cooler Master’s warranty, and for issues within the first two years
you have to deal with the retailer. That would be Amazon in my case. So I looked
at Amazon’s information on warranty issues. Their policy is that if it’s more
than 30 days since purchase, you have to send it off to a third-party repair
center and wait for them to diagnose and try to repair it. Here’s the kicker:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Usually repairs take up to 20 business days (including delivery time), but
could take slightly longer&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I use the computer for work, have upcoming LAN parties to go to, and generally
can’t do without it for an entire month. That’s assuming they reproduce
the issue: the PSU fan only turns on when it reaches a certain temperature,
so if you just plug it in briefly it won’t exhibit any symptoms.&lt;/p&gt;
&lt;!--more--&gt;
&lt;p&gt;If I was going to do a warranty return, I’d need to buy a new PSU first to
use while this one was away. If I’m spending £100+ on a PSU, then I’d be getting
a better one that doesn’t have known issues with the fans. So when the Cooler
Master eventually got returned I’d have no use for it. What a waste.&lt;/p&gt;
&lt;p&gt;So the warranty is about as much use as a chocolate teapot. Good to know, I
guess. If I wanted decent service, I should have probably used a real retailer,
not Amazon. Lesson learnt.&lt;/p&gt;
&lt;h3 id=&#34;doing-some-research&#34;&gt;Doing some research&lt;/h3&gt;
&lt;p&gt;If the warranty is useless to me, maybe I should just void it and try to fix it
myself. I did some research online. Most of the results went like this:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;if you’re not a trained professional you should not be opening up your PSU
at all. There’s a lot of current that goes through it which will seriously
hurt/main/kill you&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;or&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;it’s time consuming and potentially dangerous&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;or some other variety of doom and gloom. There were some actually useful results
sprinkled in, though. &lt;a href=&#34;https://smallformfactor.net/forum/threads/cooler-master-v850-sfx-psu-fan-swap.17294/&#34;&gt;A post on the smallformfactor.net forums&lt;/a&gt;
details someone swapping out the fan on the 850W version of the same power
supply because it was too noisy. It looks like the fan connector in the PSU
is a two-pin connector, and they just used an off-the-shelf adapter to convert
the standard four-pin case fan connector. It sounded a bit annoying to make
it all fit, though.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://old.reddit.com/r/sffpc/comments/1h97sz6/cooler_master_v850_sfx_noctua_fan_swap/&#34;&gt;A similar post on reddit&lt;/a&gt;
showed basically the same upgrade, but identified the connector as a 2.54mm
JST-XH. They crimped their own connector on, which feels a lot better than
using a bulky connector. I do have a crimping set for JST connectors, but I
absolutely hate doing them because they’re so fiddly and annoying. I’m not sure
if I trust one of my crimps inside a power supply, either.&lt;/p&gt;
&lt;p&gt;Looking at the pictures in those posts, I identified the fan as an Ong Hua
&lt;code&gt;HA9215VH12FD-F00&lt;/code&gt;. I searched to see if I could see any specifications for it.
I couldn’t. But what I did get back as my first result was another Reddit post,
this one titled &lt;a href=&#34;https://old.reddit.com/r/sffpc/comments/1b4j6vr/getting_rid_of_a_ha9215sh12fdf00_fan_from_your_psu/&#34;&gt;“Getting rid of a HA9215SH12FD-F00 fan from your PSU”&lt;/a&gt;.
It says something about the quality of a component when the first result
is a post about getting rid of it because it’s annoying&lt;sup id=&#34;fnref:2&#34;&gt;&lt;a class=&#34;footnote-ref&#34; href=&#34;#fn:2&#34; role=&#34;doc-noteref&#34;&gt;2&lt;/a&gt;&lt;/sup&gt;.&lt;/p&gt;
&lt;p&gt;All of these mods seemed easy enough, and I’m reasonably confident in my ability
to both discharge and avoid touching capacitors, so I probably wouldn’t die.
I ordered a Noctua NF-A9x14 fan and some pre-made JST-XH connectors and waited
for them to arrive.&lt;/p&gt;
&lt;h3 id=&#34;upgrade-time&#34;&gt;Upgrade time&lt;/h3&gt;
&lt;aside class=&#34;warning&#34;&gt;
  &lt;div&gt;
    &lt;h5&gt;Warning&lt;/h5&gt;
    &lt;p&gt;Like the Reddit keyboard warriors said, the stuff inside PSUs is dangerous.
Try not to kill yourself or release the magic smoke if you do this.
I’m not taking responsibility for your actions!&lt;/p&gt;
  &lt;/div&gt;
&lt;/aside&gt;
&lt;p&gt;The replacement parts arrived one evening, so when I turned the computer off
for the night I unplugged it from the mains, held the power button down for
a while, and left it overnight for good measure. The next morning I popped
open the case, disconnected and removed the PSU, gleefully tore the
“warranty void if removed” sticker off, and opened it up.&lt;/p&gt;
&lt;p&gt;Removing the fan was simple: unplug the JST connector and undo the screws
holding it to the outer panel. I confirmed that my JST connectors were the
right size, then started surgery on the Noctua fan. I carefully removed the
heatshrink, cut off the normal fan connector, and separated out the four wires.
A quick check of their &lt;a href=&#34;https://faqs.noctua.at/en/support/solutions/articles/101000081757-what-pin-configuration-do-noctua-fans-use-&#34;&gt;FAQ&lt;/a&gt;
confirmed the wiring colours: black was ground, yellow +12V, and blue and
green used for speed control (which we’re not using in this instance). I clipped
the blue and green wires off near the hub so they wouldn’t be in the way, then
cut the yellow and black wires down to length, and attached the JST connector
with a solder seal:&lt;/p&gt;
&lt;figure class=&#34;image full&#34;&gt;
  &lt;picture&gt;
      &lt;source srcset=&#34;https://chameth.com/fixing-a-loud-psu-fan-without-dying/fans.avif&#34; type=&#34;image/avif&#34;/&gt;
      &lt;source srcset=&#34;https://chameth.com/fixing-a-loud-psu-fan-without-dying/fans.webp&#34; type=&#34;image/webp&#34;/&gt;
      &lt;img src=&#34;https://chameth.com/fixing-a-loud-psu-fan-without-dying/fans.jpg&#34; alt=&#34;Two fans side by side on a mouse mat: a black fan with a short power connector, and a beige-and-brown fan with transparent solder seals over the joins in its power connector. The mouse mat has a shiny patch near the solder seals.&#34; loading=&#34;lazy&#34; width=&#34;1600&#34; height=&#34;887&#34;/&gt;
  &lt;/picture&gt;
  &lt;figcaption&gt;&lt;p&gt;Old fan, new fan, burnt mouse mat&lt;/p&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;In the process I discovered my mouse mat doesn’t like being hit with a heat gun.
Whoops. The solder seals are great: the solder in the center melts to form an
electrical connection, the parts at the end grip the cable to provide mechanical
strength, and the whole thing acts like heatshrink and keeps the connection
insulated. A lot less fiddly than crimping JST connectors, and a lot smaller
and cheaper than an adapter.&lt;/p&gt;
&lt;p&gt;I installed the fan and reassembled the PSU. Then undid it all and tried again,
as apparently the face the fan mounts to isn’t quite symmetrical and I’d
installed the fan upside down. Connected everything back up, plugged the
computer in, booted it up, and… nothing. The PSU doesn’t actually power the fan
until it hits a certain temperature. I figured putting it under load would
probably heat it up, so ran a graphics benchmark a few times. Eventually the
fan spun up. Huzzah.&lt;/p&gt;
&lt;figure class=&#34;image full&#34;&gt;
  &lt;picture&gt;
      &lt;source srcset=&#34;https://chameth.com/fixing-a-loud-psu-fan-without-dying/installed.avif&#34; type=&#34;image/avif&#34;/&gt;
      &lt;source srcset=&#34;https://chameth.com/fixing-a-loud-psu-fan-without-dying/installed.webp&#34; type=&#34;image/webp&#34;/&gt;
      &lt;img src=&#34;https://chameth.com/fixing-a-loud-psu-fan-without-dying/installed.jpg&#34; alt=&#34;Computer with the side panel removed, with a Noctua fan visibly spinning inside the PSU, next to another Noctua fan spinning above the CPU.&#34; loading=&#34;lazy&#34; width=&#34;1280&#34; height=&#34;720&#34;/&gt;
  &lt;/picture&gt;
  &lt;figcaption&gt;&lt;p&gt;Soon the entire computer will be beige and brown&lt;/p&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h3 id=&#34;peace-at-last&#34;&gt;Peace at last&lt;/h3&gt;
&lt;p&gt;I measured the sound of the new fan: 43 dB. That’s a decrease of 20 dB. Due
to the weird logarithmic properties of the dB scale that no one understands,
that means it sounds about 4 times quieter to human ears. Big improvement!&lt;/p&gt;
&lt;p&gt;It’s worth pointing out this isn’t a straight one-to-one upgrade. I don’t know
the specs of the old fan in terms of airflow, and I’m just assuming that the
Noctua will be good enough by virtue of being a decent fan. They also behave
slightly differently as the power ramps up: the stock fan starts spinning
at a lower voltage than the Noctua, which needs around 7V to get started
properly&lt;sup id=&#34;fnref:3&#34;&gt;&lt;a class=&#34;footnote-ref&#34; href=&#34;#fn:3&#34; role=&#34;doc-noteref&#34;&gt;3&lt;/a&gt;&lt;/sup&gt;. I don’t think this will be an issue, as it’s effectively just
putting a small step at the lower end of the fan curve. It might shorten the
overall lifespan of the PSU, but from my point of view it failed after four
months, so any extra time is a bonus.&lt;/p&gt;
&lt;p&gt;I recorded some before/after audio, so you can hear the difference. I think
there’s some amount of volume normalisation going on, so it’s not quite as
stark a difference as in person, but it’s still noticeable.&lt;/p&gt;
&lt;figure class=&#34;full&#34;&gt;
  &lt;audio src=&#34;https://chameth.com/fixing-a-loud-psu-fan-without-dying/before.mp3&#34; alt=&#34;Audio sample from the old fan&#34; controls=&#34;&#34;&gt;&lt;/audio&gt;
  &lt;figcaption&gt;Audio sample from the old fan&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&#34;full&#34;&gt;
  &lt;audio src=&#34;https://chameth.com/fixing-a-loud-psu-fan-without-dying/after.mp3&#34; alt=&#34;Audio sample from the new fan&#34; controls=&#34;&#34;&gt;&lt;/audio&gt;
  &lt;figcaption&gt;Audio sample from the new fan&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;And if you couldn’t hear it, here’s a visual representation:&lt;/p&gt;
&lt;figure class=&#34;image full&#34;&gt;
  &lt;picture&gt;
      &lt;source srcset=&#34;https://chameth.com/fixing-a-loud-psu-fan-without-dying/comparison.avif&#34; type=&#34;image/avif&#34;/&gt;
      &lt;source srcset=&#34;https://chameth.com/fixing-a-loud-psu-fan-without-dying/comparison.webp&#34; type=&#34;image/webp&#34;/&gt;
      &lt;img src=&#34;https://chameth.com/fixing-a-loud-psu-fan-without-dying/comparison.png&#34; alt=&#34;Side-by-side comparison of the audio spectrum of the old fan and the new fan. The old fan makes a reasonable amount of noise across a lot of frequencies, the new one is concentrated at very low frequencies.&#34; loading=&#34;lazy&#34; width=&#34;1467&#34; height=&#34;728&#34;/&gt;
  &lt;/picture&gt;
  &lt;figcaption&gt;&lt;p&gt;Side-by-side comparison of the audio clips&lt;/p&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;The whole upgrade took about an hour (less time than writing this post about
it!), and I even managed to avoid killing myself.&lt;/p&gt;
&lt;div class=&#34;footnotes&#34; role=&#34;doc-endnotes&#34;&gt;
&lt;hr/&gt;
&lt;ol&gt;
&lt;li id=&#34;fn:1&#34;&gt;
&lt;p&gt;Opening the case and sticking my ear near to various components. High-tech
stuff. &lt;a class=&#34;footnote-backref&#34; href=&#34;#fnref:1&#34; role=&#34;doc-backlink&#34;&gt;↩︎&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&#34;fn:2&#34;&gt;
&lt;p&gt;On closer inspection it’s actually a slightly different model — there’s
an &lt;code&gt;S&lt;/code&gt; not a &lt;code&gt;V&lt;/code&gt; in the middle there — but I’m going to assume that doesn’t
change much on the quality/noise front. &lt;a class=&#34;footnote-backref&#34; href=&#34;#fnref:2&#34; role=&#34;doc-backlink&#34;&gt;↩︎&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&#34;fn:3&#34;&gt;
&lt;p&gt;It then keeps spinning down to about 5V or so, it just needs enough power
to initially get started. &lt;a class=&#34;footnote-backref&#34; href=&#34;#fnref:3&#34; role=&#34;doc-backlink&#34;&gt;↩︎&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
</content>
    </entry>
    <entry>
        <title>How I use Tailscale</title>
        <link href="https://chameth.com/how-i-use-tailscale/"/>
        <updated>2025-06-25T00:00:00Z</updated>
        <id>https://chameth.com/how-i-use-tailscale/</id>
        <content xml:lang="en" type="html">&lt;figure class=&#34;image right&#34;&gt;
  &lt;picture&gt;
      &lt;source srcset=&#34;https://chameth.com/how-i-use-tailscale/logo.avif&#34; type=&#34;image/avif&#34;/&gt;
      &lt;source srcset=&#34;https://chameth.com/how-i-use-tailscale/logo.webp&#34; type=&#34;image/webp&#34;/&gt;
      &lt;img src=&#34;https://chameth.com/how-i-use-tailscale/logo.png&#34; alt=&#34;The Tailscale logo: a 3x3 grid of dots, with the middle row and bottom middle dot in white, forming a T shape&#34; loading=&#34;lazy&#34; width=&#34;500&#34; height=&#34;494&#34;/&gt;
  &lt;/picture&gt;
  &lt;figcaption&gt;&lt;p&gt;The Tailscale logo&lt;/p&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;I’ve been using &lt;a href=&#34;https://tailscale.com/&#34;&gt;Tailscale&lt;/a&gt; for around four years to connect my disparate devices,
servers and apps together. I wanted to talk a bit about how I use it, some cool
features you might not know about, and some stumbling blocks I encountered.&lt;/p&gt;
&lt;p&gt;I’m not sure Tailscale needs an introduction for the likely audience of this
blog, but I’ll give one anyway. Tailscale is basically a WireGuard&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a class=&#34;footnote-ref&#34; href=&#34;#fn:1&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;
orchestration service, with lots of nice features sprinkled on top. It’s a
subscription product, but it has an insanely generous free tier that covers
basically anything you’d ever want to do as an individual. They also open source
all their client software, and there’s a third party control server
implementation called &lt;a href=&#34;https://github.com/juanfont/headscale&#34;&gt;Headscale&lt;/a&gt; if you want to avoid the hosted system entirely.&lt;/p&gt;
&lt;h3 id=&#34;basic-connectivity&#34;&gt;Basic connectivity&lt;/h3&gt;
&lt;p&gt;At its core, Tailscale lets you easily connect from one device to another,
even if they’re not directly exposed to the Internet. You install the Tailscale
client wherever you like (on your phone, computer, servers, Raspberry Pi, etc),
authenticate the machine with the control server, and it can then talk to all
the other machines on the tailnet using their private Tailscale IP addresses.&lt;/p&gt;
&lt;p&gt;That isn’t anything revolutionary: it’s the basic premise behind VPNs. But
Tailscale makes it so easy. You don’t have to bother with any networking
configuration. You don’t have to distribute keys. You just install the
client&lt;sup id=&#34;fnref:2&#34;&gt;&lt;a class=&#34;footnote-ref&#34; href=&#34;#fn:2&#34; role=&#34;doc-noteref&#34;&gt;2&lt;/a&gt;&lt;/sup&gt;, and login.&lt;/p&gt;
&lt;!--more--&gt;
&lt;p&gt;For example, my &lt;a href=&#34;https://chameth.com/home-automation-without-megacorps/&#34;&gt;home automation service&lt;/a&gt;
runs on a Raspberry Pi that sits behind two different routers. I installed
Tailscale on it&lt;sup id=&#34;fnref:3&#34;&gt;&lt;a class=&#34;footnote-ref&#34; href=&#34;#fn:3&#34; role=&#34;doc-noteref&#34;&gt;3&lt;/a&gt;&lt;/sup&gt;, logged in, and immediately I could SSH into it from
my computer or my phone even when they’re on different networks.&lt;/p&gt;
&lt;p&gt;Speaking of SSH, Tailscale has special support for it whereby it handles any
incoming connection to port 22 from the Tailscale network, and deals with
authentication itself. No public keys or passwords: if you’re logged into
Tailscale you can be logged into the machine. This is particularly handy when
you SSH from a phone, as proper credential management is a bit of a nightmare
there.&lt;/p&gt;
&lt;p&gt;Exposing entire machines is just the start, though. If you run multiple services
on the machine you need to remember which port they’re all on. Yuck. Instead,
you can expose individual services as their own node on a tailnet. There
are lots of options for doing so: there’s &lt;a href=&#34;https://tailscale.com/kb/1282/docker&#34;&gt;an official Docker image&lt;/a&gt;,
a &lt;a href=&#34;https://pkg.go.dev/tailscale.com/tsnet&#34;&gt;Go library&lt;/a&gt;, and many third-party
tools (such as my own &lt;a href=&#34;https://github.com/csmith/centauri&#34;&gt;Centauri&lt;/a&gt; and &lt;a href=&#34;https://github.com/csmith/tsp&#34;&gt;tsp&lt;/a&gt;).&lt;/p&gt;
&lt;h3 id=&#34;not-just-a-vpn&#34;&gt;Not just a VPN&lt;/h3&gt;
&lt;p&gt;Exposing individual services wouldn’t be much use if you still had to remember
their IP addresses. For a long time I manually added DNS entries for Tailscale
nodes, allowing me to connect to &lt;code&gt;http://grafana/&lt;/code&gt; instead of
&lt;code&gt;http://100.73.190.100&lt;/code&gt;. Recently I switched to Tailscale’s &lt;a href=&#34;https://tailscale.com/kb/1081/magicdns&#34;&gt;MagicDNS&lt;/a&gt;,
though, which takes care of that for you. Every machine on the tailnet gets
an automatic DNS entry based on its name.&lt;/p&gt;
&lt;p&gt;I initially shied off of this because it changes the DNS resolver on every
machine it’s installed on, and it all seemed a bit too “magic” for me&lt;sup id=&#34;fnref:4&#34;&gt;&lt;a class=&#34;footnote-ref&#34; href=&#34;#fn:4&#34; role=&#34;doc-noteref&#34;&gt;4&lt;/a&gt;&lt;/sup&gt;. I got
fed up with manually adding DNS entries though, so I spent a bit of time
learning about it and got over my knee-jerk “what on earth is going on?!”
reaction. The DNS controls also let you force a specific upstream DNS server.
I use &lt;a href=&#34;https://nextdns.io&#34;&gt;NextDNS&lt;/a&gt; everywhere, so having Tailscale automatically
configure this for me on all my devices was a bonus&lt;sup id=&#34;fnref:5&#34;&gt;&lt;a class=&#34;footnote-ref&#34; href=&#34;#fn:5&#34; role=&#34;doc-noteref&#34;&gt;5&lt;/a&gt;&lt;/sup&gt;.&lt;/p&gt;
&lt;p&gt;As well as the short names, you can resolve nodes on the tailnet using a
slightly longer form: &lt;code&gt;machine.your-tailnet.ts.net&lt;/code&gt;. The “your-tailnet” bit
is randomly generated, and you can reroll it in the control panel to find a fun
one. But why waste time say lot word, when few word do trick? Because Tailscale
can make these addresses globally routable, and issue TLS certs for them too.&lt;/p&gt;
&lt;p&gt;Say you’re developing something on your local machine, and want to get feedback
from someone. You can use Tailscale’s “funnel” feature to expose it publicly:&lt;/p&gt;
&lt;pre class=&#34;chroma-chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;chroma-line&#34;&gt;&lt;span class=&#34;chroma-cl&#34;&gt;tailscale funnel 127.0.0.1:8080
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;With no other options, this will expose the service over HTTPS on port 443.
You can then invite people to visit &lt;code&gt;https://machine.your-tailnet.ts.net&lt;/code&gt; and
they’ll connect through to port 8080 on your machine. They don’t even need
Tailscale installed. I don’t use this terribly often, but it’s a great
quality-of-life improvement on the occasions I do want to share something.&lt;/p&gt;
&lt;p&gt;Tailscale also has a “serve” command, which does much the same but only
exposes it over your tailnet. This is how you’d use the Tailscale Docker image
to expose a normal service onto your tailnet, but it’s also useful for similar
development scenarios. Occasionally I’ll want to test something on my phone,
and rather than make sure it’s connected to the right Wi-Fi network, recompiling
the app to not bind to localhost, figuring out my machine’s IP, and so on, and
so forth, I just run &lt;code&gt;tailscale serve&lt;/code&gt; and access it over Tailscale.&lt;/p&gt;
&lt;h3 id=&#34;authentication-two-ways&#34;&gt;Authentication, two ways&lt;/h3&gt;
&lt;p&gt;One of my minor frustrations with Tailscale was how cumbersome the authentication
process was. I logged in using GitHub, and every time I tried to login to
Tailscale, I had to bounce through the GitHub OAuth flow and then select which
organisation I wanted to use. Even if I was logged in to GitHub, it still shows
the permission page every time. It’s not a dealbreaker, but it’s definitely
not smooth. This is what it looks like:&lt;/p&gt;
&lt;figure class=&#34;image full&#34;&gt;
  &lt;picture&gt;
      &lt;source srcset=&#34;https://chameth.com/how-i-use-tailscale/auth.avif&#34; type=&#34;image/avif&#34;/&gt;
      &lt;source srcset=&#34;https://chameth.com/how-i-use-tailscale/auth.webp&#34; type=&#34;image/webp&#34;/&gt;
      &lt;img src=&#34;https://chameth.com/how-i-use-tailscale/auth.png&#34; alt=&#34;Screenshots of the Tailscale/GitHub login flow: (1) The Tailscale login form (2) The GitHub login form (3) GitHub permissions screen (4) Tailscale tailnet selection screen&#34; loading=&#34;lazy&#34; width=&#34;2000&#34; height=&#34;647&#34;/&gt;
  &lt;/picture&gt;
  &lt;figcaption&gt;&lt;p&gt;Logging in to Tailscale with a GitHub account&lt;/p&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Tailscale have since added the ability to sign in with a custom OIDC provider,
so I set up a &lt;a href=&#34;https://www.keycloak.org/&#34;&gt;KeyCloak&lt;/a&gt; instance, and my login flow
now looks like this:&lt;/p&gt;
&lt;figure class=&#34;image full&#34;&gt;
  &lt;picture&gt;
      &lt;source srcset=&#34;https://chameth.com/how-i-use-tailscale/keycloak.avif&#34; type=&#34;image/avif&#34;/&gt;
      &lt;source srcset=&#34;https://chameth.com/how-i-use-tailscale/keycloak.webp&#34; type=&#34;image/webp&#34;/&gt;
      &lt;img src=&#34;https://chameth.com/how-i-use-tailscale/keycloak.png&#34; alt=&#34;Screenshots of the Tailscale/KeyCloak login flow: (1) The Tailscale login form (2) The KeyCloak login form&#34; loading=&#34;lazy&#34; width=&#34;1145&#34; height=&#34;647&#34;/&gt;
  &lt;/picture&gt;
  &lt;figcaption&gt;&lt;p&gt;Logging in to Tailscale with KeyCloak as an OIDC provider&lt;/p&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;It’s a significantly shorter flow, and because KeyCloak is entirely under my
control I can configure how long I stay logged in for. It also reduces my
reliance on third parties: if GitHub goes down, or decides to ban my account&lt;sup id=&#34;fnref:6&#34;&gt;&lt;a class=&#34;footnote-ref&#34; href=&#34;#fn:6&#34; role=&#34;doc-noteref&#34;&gt;6&lt;/a&gt;&lt;/sup&gt;
or something, I can still access Tailscale.&lt;/p&gt;
&lt;p&gt;That’s how you log in to Tailscale, but Tailscale can also assist with logging
in to other services. If you connect to a HTTP service over Tailscale, it will
add in the following headers:&lt;/p&gt;
&lt;pre class=&#34;chroma-chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;chroma-line&#34;&gt;&lt;span class=&#34;chroma-cl&#34;&gt;&lt;span class=&#34;chroma-err&#34;&gt;Tailscale-User-Login: alice@example.com
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;chroma-line&#34;&gt;&lt;span class=&#34;chroma-cl&#34;&gt;&lt;span class=&#34;chroma-err&#34;&gt;Tailscale-User-Name: Alice Smith
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;chroma-line&#34;&gt;&lt;span class=&#34;chroma-cl&#34;&gt;&lt;span class=&#34;chroma-err&#34;&gt;Tailscale-User-Profile-Pic: https://example.com/photo.jpg
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;A lot of software has support for accepting login credentials provided by a
reverse proxy, which is basically what’s happening here. For example, I run
a Grafana instance that’s only exposed over Tailscale. Its config (set
in environment variables) is:&lt;/p&gt;
&lt;pre class=&#34;chroma-chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;chroma-line&#34;&gt;&lt;span class=&#34;chroma-cl&#34;&gt;&lt;span class=&#34;chroma-nt&#34;&gt;GF_USERS_AUTO_ASSIGN_ORG&lt;/span&gt;&lt;span class=&#34;chroma-p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;chroma-w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;chroma-s2&#34;&gt;&amp;#34;true&amp;#34;&lt;/span&gt;&lt;span class=&#34;chroma-w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;chroma-line&#34;&gt;&lt;span class=&#34;chroma-cl&#34;&gt;&lt;span class=&#34;chroma-nt&#34;&gt;GF_USERS_AUTO_ASSIGN_ORG_ROLE&lt;/span&gt;&lt;span class=&#34;chroma-p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;chroma-w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;chroma-s2&#34;&gt;&amp;#34;Admin&amp;#34;&lt;/span&gt;&lt;span class=&#34;chroma-w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;chroma-line&#34;&gt;&lt;span class=&#34;chroma-cl&#34;&gt;&lt;span class=&#34;chroma-nt&#34;&gt;GF_AUTH_PROXY_ENABLED&lt;/span&gt;&lt;span class=&#34;chroma-p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;chroma-w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;chroma-s2&#34;&gt;&amp;#34;true&amp;#34;&lt;/span&gt;&lt;span class=&#34;chroma-w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;chroma-line&#34;&gt;&lt;span class=&#34;chroma-cl&#34;&gt;&lt;span class=&#34;chroma-nt&#34;&gt;GF_AUTH_PROXY_HEADER_NAME&lt;/span&gt;&lt;span class=&#34;chroma-p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;chroma-w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;chroma-s2&#34;&gt;&amp;#34;Tailscale-User-Login&amp;#34;&lt;/span&gt;&lt;span class=&#34;chroma-w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;chroma-line&#34;&gt;&lt;span class=&#34;chroma-cl&#34;&gt;&lt;span class=&#34;chroma-nt&#34;&gt;GF_AUTH_PROXY_HEADER_PROPERTY&lt;/span&gt;&lt;span class=&#34;chroma-p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;chroma-w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;chroma-s2&#34;&gt;&amp;#34;email&amp;#34;&lt;/span&gt;&lt;span class=&#34;chroma-w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;chroma-line&#34;&gt;&lt;span class=&#34;chroma-cl&#34;&gt;&lt;span class=&#34;chroma-nt&#34;&gt;GF_AUTH_PROXY_AUTO_SIGN_UP&lt;/span&gt;&lt;span class=&#34;chroma-p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;chroma-w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;chroma-s2&#34;&gt;&amp;#34;true&amp;#34;&lt;/span&gt;&lt;span class=&#34;chroma-w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;So anyone who presents a &lt;code&gt;Tailscale-User-Login&lt;/code&gt; header gets an admin account
created with that as their e-mail address. It’s super convenient, but obviously
make sure it’s &lt;em&gt;only&lt;/em&gt; exposed via Tailscale if you do that!&lt;/p&gt;
&lt;p&gt;Other services I run that support this include &lt;a href=&#34;https://miniflux.app/docs/configuration.html#auth-proxy-header&#34;&gt;Miniflux&lt;/a&gt;
(an RSS reader), &lt;a href=&#34;https://bayang.github.io/jelu-web/configuration/#configuring-proxy-authentication&#34;&gt;Jelu&lt;/a&gt; (a book tracker),
&lt;a href=&#34;https://linkding.link/options/#ld_enable_auth_proxy&#34;&gt;Linkding&lt;/a&gt; (a bookmark manager),
and &lt;a href=&#34;https://manual.seafile.com/latest/config/remote_user/&#34;&gt;Seafile&lt;/a&gt; (a file storage system).
If you’re hosting something yourself, look out for “proxy auth” or “remote users”
in the documentation or configuration. It’s amazingly convenient to be able to access things
without entering credentials.&lt;/p&gt;
&lt;h3 id=&#34;acls-tags-and-mistakes&#34;&gt;ACLs, tags and mistakes&lt;/h3&gt;
&lt;p&gt;For a long time I didn’t bother with any kind of ACLs within my Tailscale
network. Every machine could access every other machine. Then one day a thought
hit me. The default Tailscale SSH config re-prompts you for user authentication,
but I’d disabled that by tweaking the config… That means anyone with access to
any of my machines (or who managed to get Tailscale credentials out of one of
my apps) would be able to SSH into anywhere else on my network. Even as root!
Compromising a small bit of my network would immediately lead to a complete
take-over. What’s the point in defence-in-depth if you roll out a red carpet
over the drawbridge for any attackers?&lt;/p&gt;
&lt;p&gt;The first and most obvious fix for this was to restrict root access over SSH.
I changed my Tailscale ACL to prompt for reauthentication for root access, but
still allow regular SSH unprompted:&lt;/p&gt;
&lt;pre class=&#34;chroma-chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;chroma-line&#34;&gt;&lt;span class=&#34;chroma-cl&#34;&gt;&lt;span class=&#34;chroma-p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;chroma-line&#34;&gt;&lt;span class=&#34;chroma-cl&#34;&gt;  &lt;span class=&#34;chroma-nt&#34;&gt;&amp;#34;ssh&amp;#34;&lt;/span&gt;&lt;span class=&#34;chroma-p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;chroma-p&#34;&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;chroma-line&#34;&gt;&lt;span class=&#34;chroma-cl&#34;&gt;    &lt;span class=&#34;chroma-p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;chroma-line&#34;&gt;&lt;span class=&#34;chroma-cl&#34;&gt;      &lt;span class=&#34;chroma-nt&#34;&gt;&amp;#34;action&amp;#34;&lt;/span&gt;&lt;span class=&#34;chroma-p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;chroma-s2&#34;&gt;&amp;#34;accept&amp;#34;&lt;/span&gt;&lt;span class=&#34;chroma-p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;chroma-line&#34;&gt;&lt;span class=&#34;chroma-cl&#34;&gt;      &lt;span class=&#34;chroma-nt&#34;&gt;&amp;#34;src&amp;#34;&lt;/span&gt;&lt;span class=&#34;chroma-p&#34;&gt;:&lt;/span&gt;    &lt;span class=&#34;chroma-p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;chroma-s2&#34;&gt;&amp;#34;autogroup:member&amp;#34;&lt;/span&gt;&lt;span class=&#34;chroma-p&#34;&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;chroma-line&#34;&gt;&lt;span class=&#34;chroma-cl&#34;&gt;      &lt;span class=&#34;chroma-nt&#34;&gt;&amp;#34;dst&amp;#34;&lt;/span&gt;&lt;span class=&#34;chroma-p&#34;&gt;:&lt;/span&gt;    &lt;span class=&#34;chroma-p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;chroma-s2&#34;&gt;&amp;#34;autogroup:self&amp;#34;&lt;/span&gt;&lt;span class=&#34;chroma-p&#34;&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;chroma-line&#34;&gt;&lt;span class=&#34;chroma-cl&#34;&gt;      &lt;span class=&#34;chroma-nt&#34;&gt;&amp;#34;users&amp;#34;&lt;/span&gt;&lt;span class=&#34;chroma-p&#34;&gt;:&lt;/span&gt;  &lt;span class=&#34;chroma-p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;chroma-s2&#34;&gt;&amp;#34;autogroup:nonroot&amp;#34;&lt;/span&gt;&lt;span class=&#34;chroma-p&#34;&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;chroma-line&#34;&gt;&lt;span class=&#34;chroma-cl&#34;&gt;    &lt;span class=&#34;chroma-p&#34;&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;chroma-line&#34;&gt;&lt;span class=&#34;chroma-cl&#34;&gt;    &lt;span class=&#34;chroma-p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;chroma-line&#34;&gt;&lt;span class=&#34;chroma-cl&#34;&gt;      &lt;span class=&#34;chroma-nt&#34;&gt;&amp;#34;action&amp;#34;&lt;/span&gt;&lt;span class=&#34;chroma-p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;chroma-s2&#34;&gt;&amp;#34;check&amp;#34;&lt;/span&gt;&lt;span class=&#34;chroma-p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;chroma-line&#34;&gt;&lt;span class=&#34;chroma-cl&#34;&gt;      &lt;span class=&#34;chroma-nt&#34;&gt;&amp;#34;src&amp;#34;&lt;/span&gt;&lt;span class=&#34;chroma-p&#34;&gt;:&lt;/span&gt;    &lt;span class=&#34;chroma-p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;chroma-s2&#34;&gt;&amp;#34;autogroup:member&amp;#34;&lt;/span&gt;&lt;span class=&#34;chroma-p&#34;&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;chroma-line&#34;&gt;&lt;span class=&#34;chroma-cl&#34;&gt;      &lt;span class=&#34;chroma-nt&#34;&gt;&amp;#34;dst&amp;#34;&lt;/span&gt;&lt;span class=&#34;chroma-p&#34;&gt;:&lt;/span&gt;    &lt;span class=&#34;chroma-p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;chroma-s2&#34;&gt;&amp;#34;autogroup:self&amp;#34;&lt;/span&gt;&lt;span class=&#34;chroma-p&#34;&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;chroma-line&#34;&gt;&lt;span class=&#34;chroma-cl&#34;&gt;      &lt;span class=&#34;chroma-nt&#34;&gt;&amp;#34;users&amp;#34;&lt;/span&gt;&lt;span class=&#34;chroma-p&#34;&gt;:&lt;/span&gt;  &lt;span class=&#34;chroma-p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;chroma-s2&#34;&gt;&amp;#34;root&amp;#34;&lt;/span&gt;&lt;span class=&#34;chroma-p&#34;&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;chroma-line&#34;&gt;&lt;span class=&#34;chroma-cl&#34;&gt;    &lt;span class=&#34;chroma-p&#34;&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;chroma-line&#34;&gt;&lt;span class=&#34;chroma-cl&#34;&gt;  &lt;span class=&#34;chroma-p&#34;&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;chroma-line&#34;&gt;&lt;span class=&#34;chroma-cl&#34;&gt;&lt;span class=&#34;chroma-p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;This still didn’t sit right with me, though. Why should a random webserver be
able to (theoretically) SSH into my desktop computer unchallenged? Tailscale
allows you to do more advanced ACLs by applying tags to devices. I dutifully
created a bunch of tags, and went through and tagged every device: &lt;code&gt;user&lt;/code&gt;, &lt;code&gt;server&lt;/code&gt;,
&lt;code&gt;app&lt;/code&gt;, &lt;code&gt;container&lt;/code&gt;, and so on. This, it turns out, was a mistake. I could no
longer SSH to anywhere. If I’d read
&lt;a href=&#34;https://tailscale.com/kb/1068/tags&#34;&gt;the docs&lt;/a&gt; properly, I might have noticed
how they describe tags:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Tailscale tags are how you authenticate and identify non-user devices, such as
servers and ephemeral nodes. They serve two primary purposes: to provide an
identity to non-user devices and to let you manage access control policies based on purpose.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;By applying a nice &lt;code&gt;user&lt;/code&gt; tag to all of my devices (computer, phone, tablet and
so on), I’d effectively removed my own identity from them. They no longer
counted for the &lt;code&gt;autogroup:member&lt;/code&gt; source in the SSH config. Whoops. And it’s
not easy to fix either:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;You cannot remove all tags from a device. A device with a tag-based identity
must have at least one tag.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;So I’d have to remove all the affected devices, then re-add them. At the time
I wanted to roll back &lt;em&gt;all&lt;/em&gt; the tags, which would mean reconnecting dozens of
nodes to the Tailnet. I did end up doing that, but I also took it as an
opportunity to switch to KeyCloak as I mentioned earlier. Setting everything
up again was a bit less painful when it wasn’t just correcting a dumb mistake.&lt;/p&gt;
&lt;p&gt;I now have a much more sensible tag setup: servers are tagged &lt;code&gt;server&lt;/code&gt;,
apps are tagged &lt;code&gt;app&lt;/code&gt;, and a few special apps are tagged &lt;code&gt;integration&lt;/code&gt;. I then
use Tailscale’s grants to limit access within the tailnet:&lt;/p&gt;
&lt;pre class=&#34;chroma-chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;chroma-line&#34;&gt;&lt;span class=&#34;chroma-cl&#34;&gt;&lt;span class=&#34;chroma-p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;chroma-line&#34;&gt;&lt;span class=&#34;chroma-cl&#34;&gt;  &lt;span class=&#34;chroma-nt&#34;&gt;&amp;#34;grants&amp;#34;&lt;/span&gt;&lt;span class=&#34;chroma-p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;chroma-p&#34;&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;chroma-line&#34;&gt;&lt;span class=&#34;chroma-cl&#34;&gt;    &lt;span class=&#34;chroma-p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;chroma-line&#34;&gt;&lt;span class=&#34;chroma-cl&#34;&gt;      &lt;span class=&#34;chroma-c1&#34;&gt;// Users can access everything
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;chroma-line&#34;&gt;&lt;span class=&#34;chroma-cl&#34;&gt;      &lt;span class=&#34;chroma-nt&#34;&gt;&amp;#34;src&amp;#34;&lt;/span&gt;&lt;span class=&#34;chroma-p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;chroma-p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;chroma-s2&#34;&gt;&amp;#34;autogroup:member&amp;#34;&lt;/span&gt;&lt;span class=&#34;chroma-p&#34;&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;chroma-line&#34;&gt;&lt;span class=&#34;chroma-cl&#34;&gt;      &lt;span class=&#34;chroma-nt&#34;&gt;&amp;#34;dst&amp;#34;&lt;/span&gt;&lt;span class=&#34;chroma-p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;chroma-p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;chroma-s2&#34;&gt;&amp;#34;*&amp;#34;&lt;/span&gt;&lt;span class=&#34;chroma-p&#34;&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;chroma-line&#34;&gt;&lt;span class=&#34;chroma-cl&#34;&gt;      &lt;span class=&#34;chroma-nt&#34;&gt;&amp;#34;ip&amp;#34;&lt;/span&gt;&lt;span class=&#34;chroma-p&#34;&gt;:&lt;/span&gt;  &lt;span class=&#34;chroma-p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;chroma-s2&#34;&gt;&amp;#34;*&amp;#34;&lt;/span&gt;&lt;span class=&#34;chroma-p&#34;&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;chroma-line&#34;&gt;&lt;span class=&#34;chroma-cl&#34;&gt;    &lt;span class=&#34;chroma-p&#34;&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;chroma-line&#34;&gt;&lt;span class=&#34;chroma-cl&#34;&gt;    &lt;span class=&#34;chroma-p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;chroma-line&#34;&gt;&lt;span class=&#34;chroma-cl&#34;&gt;      &lt;span class=&#34;chroma-c1&#34;&gt;// Servers and integrations can access integrations and apps
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;chroma-line&#34;&gt;&lt;span class=&#34;chroma-cl&#34;&gt;      &lt;span class=&#34;chroma-nt&#34;&gt;&amp;#34;src&amp;#34;&lt;/span&gt;&lt;span class=&#34;chroma-p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;chroma-p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;chroma-s2&#34;&gt;&amp;#34;tag:server&amp;#34;&lt;/span&gt;&lt;span class=&#34;chroma-p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;chroma-s2&#34;&gt;&amp;#34;tag:integration&amp;#34;&lt;/span&gt;&lt;span class=&#34;chroma-p&#34;&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;chroma-line&#34;&gt;&lt;span class=&#34;chroma-cl&#34;&gt;      &lt;span class=&#34;chroma-nt&#34;&gt;&amp;#34;dst&amp;#34;&lt;/span&gt;&lt;span class=&#34;chroma-p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;chroma-p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;chroma-s2&#34;&gt;&amp;#34;tag:integration&amp;#34;&lt;/span&gt;&lt;span class=&#34;chroma-p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;chroma-s2&#34;&gt;&amp;#34;tag:app&amp;#34;&lt;/span&gt;&lt;span class=&#34;chroma-p&#34;&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;chroma-line&#34;&gt;&lt;span class=&#34;chroma-cl&#34;&gt;      &lt;span class=&#34;chroma-nt&#34;&gt;&amp;#34;ip&amp;#34;&lt;/span&gt;&lt;span class=&#34;chroma-p&#34;&gt;:&lt;/span&gt;  &lt;span class=&#34;chroma-p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;chroma-s2&#34;&gt;&amp;#34;*&amp;#34;&lt;/span&gt;&lt;span class=&#34;chroma-p&#34;&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;chroma-line&#34;&gt;&lt;span class=&#34;chroma-cl&#34;&gt;    &lt;span class=&#34;chroma-p&#34;&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;chroma-line&#34;&gt;&lt;span class=&#34;chroma-cl&#34;&gt;  &lt;span class=&#34;chroma-p&#34;&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;chroma-line&#34;&gt;&lt;span class=&#34;chroma-cl&#34;&gt;&lt;span class=&#34;chroma-p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;This stops anyone but a user device from accessing servers, and stops plain
apps from accessing anything at all. So for example my Grafana instance is
tagged as an &lt;code&gt;app&lt;/code&gt;; it doesn’t connect out over Tailscale for anything, it only
exposes its interface over Tailscale. My home automation software is tagged as
an &lt;code&gt;integration&lt;/code&gt;, as it reaches out to other services over Tailscale (e.g., to
push metrics it receives from devices).&lt;/p&gt;
&lt;p&gt;You could go even further and limit which specific machines talk to which
others, but I think this tier system sets reasonable boundaries for my use
without getting too much in the way.&lt;/p&gt;
&lt;h3 id=&#34;even-more&#34;&gt;Even more&lt;/h3&gt;
&lt;p&gt;There are lots of other cool features offered by Tailscale that I’ve not
covered: exit nodes (allowing you to route normal Internet traffic over
Tailscale; very handy when you’re behind a router you don’t trust, or if
you want to appear as being in another country for totally legitimate reasons);
Tailscale lock (a system where existing nodes have to verify any new ones,
guarding against both unauthorised access and Tailscale themselves inserting
nodes into your network); file sharing, and more I’ve probably forgotten.&lt;/p&gt;
&lt;p&gt;As I mentioned before, an awful lot is available on the free personal plan.
It’s definitely worth checking out if you manage servers, or self-host anything.
I can’t imagine going back to managing servers and private apps without
Tailscale, and I’m excited to see what else they do going forward.&lt;/p&gt;
&lt;div class=&#34;footnotes&#34; role=&#34;doc-endnotes&#34;&gt;
&lt;hr/&gt;
&lt;ol&gt;
&lt;li id=&#34;fn:1&#34;&gt;
&lt;p&gt;If you’re not familiar with it, WireGuard is a modern VPN included in
the Linux kernel. It’s basically the only VPN that isn’t terrible. &lt;a class=&#34;footnote-backref&#34; href=&#34;#fnref:1&#34; role=&#34;doc-backlink&#34;&gt;↩︎&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&#34;fn:2&#34;&gt;
&lt;p&gt;They have installation instructions and packaged versions of the client
for just about every device you can imagine: Windows, Mac, every major Linux
distribution, iOS, Android, etc, etc &lt;a class=&#34;footnote-backref&#34; href=&#34;#fnref:2&#34; role=&#34;doc-backlink&#34;&gt;↩︎&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&#34;fn:3&#34;&gt;
&lt;p&gt;They even have an apt repository specifically for raspbian builds, so it’s
super easy. &lt;a class=&#34;footnote-backref&#34; href=&#34;#fnref:3&#34; role=&#34;doc-backlink&#34;&gt;↩︎&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&#34;fn:4&#34;&gt;
&lt;p&gt;Lots of people seem to treat “magic” as a good thing in software. I think
it’s the absolutely opposite. I want to know how something works, not for it to
be inscrutable! &lt;a class=&#34;footnote-backref&#34; href=&#34;#fnref:4&#34; role=&#34;doc-backlink&#34;&gt;↩︎&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&#34;fn:5&#34;&gt;
&lt;p&gt;This is entirely optional, of course, you can just let each device do
their own thing as well. &lt;a class=&#34;footnote-backref&#34; href=&#34;#fnref:5&#34; role=&#34;doc-backlink&#34;&gt;↩︎&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&#34;fn:6&#34;&gt;
&lt;p&gt;I don’t think this is likely, but it’s one of my biggest concerns about
using “social” logins. More-or-less all of these services can arbitrarily ban
you with no recourse; why would you trust them as keyholders to other things? &lt;a class=&#34;footnote-backref&#34; href=&#34;#fnref:6&#34; role=&#34;doc-backlink&#34;&gt;↩︎&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
</content>
    </entry>
    <entry>
        <title>Building a new Computer</title>
        <link href="https://chameth.com/building-a-new-computer/"/>
        <updated>2025-06-03T00:00:00Z</updated>
        <id>https://chameth.com/building-a-new-computer/</id>
        <content xml:lang="en" type="html">&lt;figure class=&#34;image right&#34;&gt;
  &lt;picture&gt;
      &lt;source srcset=&#34;https://chameth.com/building-a-new-computer/finished.avif&#34; type=&#34;image/avif&#34;/&gt;
      &lt;source srcset=&#34;https://chameth.com/building-a-new-computer/finished.webp&#34; type=&#34;image/webp&#34;/&gt;
      &lt;img src=&#34;https://chameth.com/building-a-new-computer/finished.jpg&#34; alt=&#34;A small form factor PC sat on a desk, with a pen propped up in front of it for scale. It&amp;#39;s about 1.5 pens tall. The case is silver, with a wooden panel at the bottom.&#34; loading=&#34;lazy&#34; width=&#34;375&#34; height=&#34;500&#34;/&gt;
  &lt;/picture&gt;
  &lt;figcaption&gt;&lt;p&gt;The finished PC. Cat pen for scale.&lt;/p&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;I recently&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a class=&#34;footnote-ref&#34; href=&#34;#fn:1&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt; built a new computer, after exclusively using a laptop for three
years. It’s also the first time I’ve departed from the usual combo of an Intel
CPU and Nvidia GPU.&lt;/p&gt;
&lt;p&gt;While the form factor of a laptop did make it amazingly handy for travelling
and attending LAN events, it was starting to show its age and there was
basically no sane upgrade path. The main problem was its 3060 mobile graphics
card, which was &lt;em&gt;okay&lt;/em&gt; for the first few years and then slowly descended into
&lt;em&gt;painful&lt;/em&gt;. At the time, the (fairly disappointing) 50-series had just been
released, but hadn’t yet made it into laptops. Nvidia had stopped production
on the 40-series beforehand, so there also weren’t any compelling options there,
either.&lt;/p&gt;
&lt;p&gt;That’s not to say there were no laptops at all that I could have upgraded to.
There were. Just not really any that ticked all of my perfectly normal boxes
like “run Linux”, “have at least 64GB of ram”, and “run modern games well”.
Having to upgrade the entire system just because the graphics card was
showing its age was a bit of a drag, too. So back to the land of desktop
computers I went!&lt;/p&gt;
&lt;p&gt;To try to preserve some of that convenience, I opted for a small form factor
(SFF) case. The computer and all the accessories can fit inside a
hand-luggage-sized flight case. More on that later, though.&lt;/p&gt;
&lt;h3 id=&#34;components-choices-and-cramming&#34;&gt;Components, Choices, and Cramming&lt;/h3&gt;
&lt;p&gt;So what, exactly, is in this computer? The case is a Fractal Design Terra,
which is a lovely little 10.4L case&lt;sup id=&#34;fnref:2&#34;&gt;&lt;a class=&#34;footnote-ref&#34; href=&#34;#fn:2&#34; role=&#34;doc-noteref&#34;&gt;2&lt;/a&gt;&lt;/sup&gt;. My last desktop PC was a normal-sized
Fractal Design case, which I liked a lot, and it seems like they’ve upped their
game since then. The Terra is both pleasant to look at (just look at that
wooden panel!), and a breeze to work in. The sides and top are fully and easily
removable, giving you great access to everything inside&lt;sup id=&#34;fnref:3&#34;&gt;&lt;a class=&#34;footnote-ref&#34; href=&#34;#fn:3&#34; role=&#34;doc-noteref&#34;&gt;3&lt;/a&gt;&lt;/sup&gt;. I expected an SFF
build to be fiddly, but the case made it feel about the same as a normal
full-sized build&lt;sup id=&#34;fnref:4&#34;&gt;&lt;a class=&#34;footnote-ref&#34; href=&#34;#fn:4&#34; role=&#34;doc-noteref&#34;&gt;4&lt;/a&gt;&lt;/sup&gt;.&lt;/p&gt;
&lt;!--more--&gt;
&lt;figure class=&#34;image left&#34;&gt;
  &lt;picture&gt;
      &lt;source srcset=&#34;https://chameth.com/building-a-new-computer/build.avif&#34; type=&#34;image/avif&#34;/&gt;
      &lt;source srcset=&#34;https://chameth.com/building-a-new-computer/build.webp&#34; type=&#34;image/webp&#34;/&gt;
      &lt;img src=&#34;https://chameth.com/building-a-new-computer/build.jpg&#34; alt=&#34;The computer fully built, but with the sides and top of the case off, and wires protruding everywhere.&#34; loading=&#34;lazy&#34; width=&#34;500&#34; height=&#34;375&#34;/&gt;
  &lt;/picture&gt;
  &lt;figcaption&gt;&lt;p&gt;The case with sides and top off, and wires everywhere in desperate need of management.&lt;/p&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Another nice feature of the case is the movable spine. I think this is
relatively common in SFF cases, but it was new to me. You mount the graphics
card on one side of a metal divider, and everything else on the other. The
divider (or spine) can be moved side-to-side depending on what exactly you’re
putting in the case.&lt;/p&gt;
&lt;p&gt;As I mentioned earlier, this was my first departure from the Intel + Nvidia
bandwagon. Nvidia’s 50 series was underwhelming, and Intel managed to put out
a generation of chips that literally fried themselves. It seemed like a good
time to try out AMD’s offering! I went for the newly released Radeon RX 9070XT
graphics card, and a Ryzen 7 9800X3D processor&lt;sup id=&#34;fnref:5&#34;&gt;&lt;a class=&#34;footnote-ref&#34; href=&#34;#fn:5&#34; role=&#34;doc-noteref&#34;&gt;5&lt;/a&gt;&lt;/sup&gt;. The processor has a
Thermalright AXP90 X47 Full heatsink on top of it, with a Noctua NF-A9 fan
on top of that.&lt;/p&gt;
&lt;p&gt;The motherboard is a Gigabyte B850I Aorus Pro, and it hosts 2 32GB Corsair
Vengeance RAM modules, and a 2TB Crucial T705 NVMe drive. Powering it all is
a Cooler Master V750 SFX. The PSU is modular to reduce the number of wires that
need to be fitted in, but they’re still pretty big and bulky. I’m tempted by
custom cables but they’re rather pricey, and you can’t actually see inside
with the sides closed…&lt;/p&gt;
&lt;p&gt;With the diminutive size of the case and all the components crammed in,
there’s actually no room left over for case fans. The PSU, GPU and CPU all have
fans attached, but that’s it. There are stories online of people having heat
issues, but thankfully everything seems pretty happy in my setup. The components
all draw in air from the sides, and the hot air passively vents out the top. If
I keep the CPU under maximum load for a while then it starts to thermal throttle
slightly, but the only time I’ve actually managed that is when compiling a
kernel. Why was I compiling a kernel, you ask? Well, we’ll come to that.&lt;/p&gt;
&lt;h3 id=&#34;but-does-it-linux&#34;&gt;But does it Linux?&lt;/h3&gt;
&lt;p&gt;I didn’t go into this build &lt;em&gt;completely&lt;/em&gt; blind. I did a bit of reading and
chatting, and it sounded like AMD drivers were pretty good on Linux these
days. I didn’t check specifically if any of the components were supported.&lt;/p&gt;
&lt;p&gt;The 9070XT was released on the 6th of March. I built my PC on the 26th
of March. The first version of Mesa (the 3D graphics lib) that was generally
stable with 9070XT cards landed in Arch on the 20th of March. If I did the build
just one week earlier, I would’ve had a much less fun experience.&lt;/p&gt;
&lt;p&gt;It still wasn’t quite perfectly smooth, though. When playing games I’d
occasionally have issues. In some cases the screen just went blank and came
back after switching windows, but in others the graphics drivers couldn’t
recover and the PC needed rebooting. Fortunately the drivers are open source,
and they have a public &lt;a href=&#34;https://gitlab.freedesktop.org/drm/amd&#34;&gt;issue tracker&lt;/a&gt;
hosted by the Freedesktop project. Searching through the issues, I found they’d
already been reported (by another Arch user, of course), and there were various
suggestions for work-arounds, as well as lots of work trying to reproduce the
issue.&lt;/p&gt;
&lt;p&gt;Within a week, an AMD developer had posted a set of patches that might address
the issues, and asked people to test them. That’s fortunately pretty easy on
Arch: you just clone the repository containing the &lt;code&gt;PKGBUILD&lt;/code&gt; file, drop in
the patches, and update the checksums for them. Then you start compiling,
realise you didn’t tell it to use more than one CPU core, abort it, and start
again but this time running on all cylinders. Soon enough I was running a
patched 6.14 kernel and the problems stopped completely. Others reported
similar outcomes, and the patches worked their way into the kernel proper.&lt;/p&gt;
&lt;p&gt;I spent a few weeks having to compile a custom kernel every time I accidentally
updated it (I should’ve just stopped &lt;code&gt;pacman&lt;/code&gt; from touching the kernel for a
bit…), then one day the patches didn’t apply because they’d been merged
upstream. Since then everything has been perfect.&lt;/p&gt;
&lt;p&gt;A friend commented that “this wouldn’t happen with Nvidia”. They meant it
negatively, but I wholeheartedly agree! Maybe Nvidia have fewer launch bugs
than AMD, but you &lt;em&gt;absolutely&lt;/em&gt; wouldn’t be able to talk to their driver
engineers on a public bug tracker, and get access to test patches that fix
your issue. I’ll happily take a few bugs in exchange for a company that operates
openly in a way consistent with the rest of the Linux community.&lt;/p&gt;
&lt;h3 id=&#34;but-does-it-travel&#34;&gt;But does it travel?&lt;/h3&gt;
&lt;figure class=&#34;image right&#34;&gt;
  &lt;picture&gt;
      &lt;source srcset=&#34;https://chameth.com/building-a-new-computer/case.avif&#34; type=&#34;image/avif&#34;/&gt;
      &lt;source srcset=&#34;https://chameth.com/building-a-new-computer/case.webp&#34; type=&#34;image/webp&#34;/&gt;
      &lt;img src=&#34;https://chameth.com/building-a-new-computer/case.jpg&#34; alt=&#34;An open flight case, with the PC slotted in surrounded by foam. A keyboard sits below it, and various accessories on the side with 3D-printed supports.&#34; loading=&#34;lazy&#34; width=&#34;500&#34; height=&#34;375&#34;/&gt;
  &lt;/picture&gt;
  &lt;figcaption&gt;&lt;p&gt;Travel mode, engage!&lt;/p&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;So the computer works fine at home, but how do I get it to other places? I just
shoved a laptop in a backpack&lt;sup id=&#34;fnref:6&#34;&gt;&lt;a class=&#34;footnote-ref&#34; href=&#34;#fn:6&#34; role=&#34;doc-noteref&#34;&gt;6&lt;/a&gt;&lt;/sup&gt;, but you can’t quite do that with a PC even
one this size. I’d seen a few people at LANs who packed everything in flight
cases, but they always seemed a bit unwieldy. Doing some research, though, I
found that I’d just be able to squeeze everything into a flight case sized to
be taken onto a plane as cabin baggage.&lt;/p&gt;
&lt;p&gt;Peli (or Pelican in the US) are the most well known maker of flight cases, but
I chose to go with Nanuk instead. Spec-wise they’re fairly similar. Nanuk are
a bit cheaper. The killer difference for me, though, is that Nanuk publish
STEP files of their cases. As someone with a 3D printer, giving me CAD models
of things so that I can easily mod them is definitely a way to win my favour.&lt;/p&gt;
&lt;p&gt;After lots of measuring and thinking and modelling I came up with an arrangement
where everything could fit snugly into the case. The case has cutouts for the
wheels and handles, which constrain what can go where. I ended up wanting the
computer at the handle-end of the case to make best use of space, but that means
it needs something to take its weight when the case is vertical. The solution
was, of course, 3D printing.&lt;/p&gt;
&lt;p&gt;Using the STEP files from Nanuk I designed an insert that spans across the
case, with screw holes that line up with the ones in the flight case. I wasn’t
sure it would be able to take the weight like that, so I also added in some
supports in the other direction (running down to the bottom of the case, if it’s
stood up). I ended up printing it in three parts, and it came out perfectly first
time. I can’t emphasise how nice it is having CAD models instead of having to
measure and guess at things.&lt;/p&gt;
&lt;p&gt;With the support in place, I focused on cushioning the computer. I opted for
10mm thick EVA foam as it’s easy to obtain and work with, and doesn’t take up too much
room. I used contact adhesive to glue the foam directly to the case and the
3D printed divider. There’s a piece that goes between the computer and the
keyboard, so I printed some little 3D supports to hold that more firmly in
place, and stuck those in with contact adhesive as well.&lt;/p&gt;
&lt;p&gt;So how does it all hold up? It’s been to one LAN event so far, and it’s great.
I think the flight case might actually be easier to carry than hefting a heavy
backpack: the handles are sturdy and comfortable, and it has chunky wheels for
pulling it around. It’s also actually easier to get everything set up when you
can see it all laid out in the flight case and pull out what you need, and then
the case can be tucked away out the way for the duration of the event.&lt;/p&gt;
&lt;div class=&#34;footnotes&#34; role=&#34;doc-endnotes&#34;&gt;
&lt;hr/&gt;
&lt;ol&gt;
&lt;li id=&#34;fn:1&#34;&gt;
&lt;p&gt;Recently-ish. It may or may not have taken me a few months to get around
to writing this post. &lt;a class=&#34;footnote-backref&#34; href=&#34;#fnref:1&#34; role=&#34;doc-backlink&#34;&gt;↩︎&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&#34;fn:2&#34;&gt;
&lt;p&gt;Using litres to measure computer cases always feels wrong. Those are
the units we use for water. Don’t put them near the computers! &lt;a class=&#34;footnote-backref&#34; href=&#34;#fnref:2&#34; role=&#34;doc-backlink&#34;&gt;↩︎&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&#34;fn:3&#34;&gt;
&lt;p&gt;The case also has holes to put security screws in to stop all of these
nice easily removable parts from being removable. Very handy when you’re
leaving it unattended at a LAN. &lt;a class=&#34;footnote-backref&#34; href=&#34;#fnref:3&#34; role=&#34;doc-backlink&#34;&gt;↩︎&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&#34;fn:4&#34;&gt;
&lt;p&gt;Which for me means it was good fun for about an hour, and then I got fed
up and just wanted it to be done already. &lt;a class=&#34;footnote-backref&#34; href=&#34;#fnref:4&#34; role=&#34;doc-backlink&#34;&gt;↩︎&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&#34;fn:5&#34;&gt;
&lt;p&gt;Three months in and I still can’t remember these random strings of
numbers. Someone even explained the versioning scheme to me. &lt;a class=&#34;footnote-backref&#34; href=&#34;#fnref:5&#34; role=&#34;doc-backlink&#34;&gt;↩︎&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&#34;fn:6&#34;&gt;
&lt;p&gt;Along with a portable monitor, mouse, keyboard, headset, mouse mat,
kensington lock, power supply, cables, and controller. It was a heavy bag. &lt;a class=&#34;footnote-backref&#34; href=&#34;#fnref:6&#34; role=&#34;doc-backlink&#34;&gt;↩︎&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
</content>
    </entry>
    <entry>
        <title>How I Get Things Done</title>
        <link href="https://chameth.com/how-i-get-things-done/"/>
        <updated>2024-09-01T00:00:00Z</updated>
        <id>https://chameth.com/how-i-get-things-done/</id>
        <content xml:lang="en" type="html">&lt;p&gt;I always quite like reading about how other people &lt;em&gt;do things&lt;/em&gt;. What software
or hardware they use, or how they manage reminders, todo lists, and so on.
I’ve never actually written about how I do any of that, though. So here it is!&lt;/p&gt;
&lt;h3 id=&#34;productivity&#34;&gt;Productivity&lt;/h3&gt;
&lt;p&gt;In the past I’ve fallen victim to the idea of there being One True Productivity
System that would solve all my problems and make me amazing at getting things
done. The title of this post is a nod to Getting Things Done, which I’ve read
and tried to religiously follow in the past, but it’s just not for me. One thing
that did actually stick from it, though, was the idea of “open loops”:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Anything that does not belong where it is, the way it is, is an “open loop,”
which will be pulling on your attention if it’s not appropriately managed.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;If I want to do something and it’s not recorded in a way I trust, it
weighs on me a little. Those little weights all add up, and just make life
uncomfortable. I deal with those in a few ways:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Inbox Zero-ish: if an e-mail needs me to do something, it sits in my inbox
until it’s done. When it’s done, it gets archived.&lt;/li&gt;
&lt;li&gt;Notes: random things I try to remember I put into my notes, so I can search
for them later.&lt;/li&gt;
&lt;li&gt;Budget: anything monetary I just adjust in my budget or create a category for.&lt;/li&gt;
&lt;li&gt;Todo list: any other kind of task I want/need to do either now or at some
point in the future goes into Todoist.&lt;/li&gt;
&lt;/ul&gt;
&lt;!--more--&gt;
&lt;h4 id=&#34;todoist&#34;&gt;Todoist&lt;/h4&gt;
&lt;p&gt;In the past I’ve gone through a lot of different todo systems, once again
hunting for one that will fix all my problems etc&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a class=&#34;footnote-ref&#34; href=&#34;#fn:1&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;. In the end I always ended
up coming back to &lt;a href=&#34;https://todoist.com/&#34;&gt;Todoist&lt;/a&gt;, and have stuck with it for a
decent period now.&lt;/p&gt;
&lt;p&gt;In Todoist, I have everything split up into projects. Work projects are one
colour and personal projects are another. Anything that needs more than a
handful of individual tasks gets a project, which is archived when it’s done.
Any one-off things that don’t neatly fall into projects go into “Random junk”
project.&lt;/p&gt;
&lt;p&gt;As I’m writing this, I have 116 items in 22 projects. A good deal of those are
things that I might want to do at some point, not things that I actively need
to worry about. If I want to get one of them done, I schedule it so it shows
up in the “today” view. I have the Todoist desktop app open automatically when
I login to my computer, and it gets positioned on the right hand side of my
ultra-wide monitor, so I can see the “today” view and add/remove things
immediately at any point.&lt;/p&gt;
&lt;p&gt;I’m not precious about tasks becoming overdue, or unscheduling things I’d
previously scheduled. Priorities change, ideas that sounded good a week ago
might no longer sound good, and so on.&lt;/p&gt;
&lt;p&gt;I do a few things to help me manage tasks and keep track of things:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;I have a monthly recurring task to look through everything that’s not
scheduled, just so I keep a rough idea of what’s there, and can update or
get rid of it as needed.&lt;/li&gt;
&lt;li&gt;I wrote &lt;a href=&#34;https://github.com/csmith/todoistager&#34;&gt;todoistager&lt;/a&gt; and have it
running on a server to automatically apply tags to tasks based on their rough
age: &lt;code&gt;weeks&lt;/code&gt;, &lt;code&gt;months&lt;/code&gt; or &lt;code&gt;years&lt;/code&gt;. This lets me identify things that are
lingering and reconsider them&lt;sup id=&#34;fnref:2&#34;&gt;&lt;a class=&#34;footnote-ref&#34; href=&#34;#fn:2&#34; role=&#34;doc-noteref&#34;&gt;2&lt;/a&gt;&lt;/sup&gt;.&lt;/li&gt;
&lt;li&gt;I automate adding tasks for things that demand my attention, like incoming
GitHub pull requests. The Todoist API is nice and straight forward, and
hooking it up to things is trivial.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;other-desktop-software&#34;&gt;Other desktop software&lt;/h3&gt;
&lt;p&gt;For notes I use &lt;a href=&#34;https://logseq.com/&#34;&gt;Logseq&lt;/a&gt;, and I just put whatever I need
to write under today’s note and rely on search or tags to find it again when
I need to. I note basically anything that I might like to use again in the
future. One of my most common tags is &lt;code&gt;#blub&lt;/code&gt;, a term I came across in
the excellent article “&lt;a href=&#34;https://www.benkuhn.net/blub/&#34;&gt;In defense of blub studies&lt;/a&gt;”.
Blub is random ultra-specific knowledge; it might not be eminently useful
to know on its own, but over time it can pay dividends.&lt;/p&gt;
&lt;p&gt;I’ve previously tried a bunch of note taking apps, and methodologies, but like
with todo lists I end up just wanting something that &lt;em&gt;just works&lt;/em&gt; and stays out
of the way. Logseq stores notes in Markdown, and I have a cronjob to commit and
push my changes to a private git repository.&lt;/p&gt;
&lt;p&gt;Like Todoist, Logseq launches when I log into my computer, and sits in the same
500px-or-so region on the right of my monitor. This allows me to switch from
Todoist to take or refer to notes when needed. To do this positioning, I use
&lt;a href=&#34;https://www.nongnu.org/devilspie2/&#34;&gt;devilspie2&lt;/a&gt;. I also use this to position
Discord and my IRC client side-by-side on a small portable monitor that sits
underneath my ultrawide.&lt;/p&gt;
&lt;p&gt;More mundane software: I use &lt;a href=&#34;https://www.jetbrains.com/idea/&#34;&gt;IntejjiJ IDEA&lt;/a&gt;
for almost all development and complex text editing&lt;sup id=&#34;fnref:3&#34;&gt;&lt;a class=&#34;footnote-ref&#34; href=&#34;#fn:3&#34; role=&#34;doc-noteref&#34;&gt;3&lt;/a&gt;&lt;/sup&gt;. The only exception is
Android development where &lt;a href=&#34;https://developer.android.com/studio&#34;&gt;Android Studio&lt;/a&gt;
rules the roost. For lighter text editing, &lt;a href=&#34;https://www.sublimetext.com/&#34;&gt;Sublime Text&lt;/a&gt;
is my choice.&lt;/p&gt;
&lt;p&gt;I spend a fair bit of the time at the command line. I use &lt;a href=&#34;https://sw.kovidgoyal.net/kitty/&#34;&gt;kitty&lt;/a&gt;
as a terminal emulator, with the &lt;a href=&#34;https://www.zsh.org/&#34;&gt;zsh&lt;/a&gt; shell and
&lt;a href=&#34;https://ohmyz.sh/&#34;&gt;Oh My Zsh&lt;/a&gt; for some nice plugins and enhancements. One thing
I couldn’t live without is &lt;a href=&#34;https://github.com/wting/autojump&#34;&gt;autojump&lt;/a&gt;, which
allows quickly jumping to any directory you’ve previously visited using a
substring of the name.&lt;/p&gt;
&lt;p&gt;Web browsing is all &lt;a href=&#34;https://www.mozilla.org/en-GB/firefox/new/&#34;&gt;Firefox&lt;/a&gt;,
with &lt;a href=&#34;https://bitwarden.com/&#34;&gt;Bitwarden&lt;/a&gt; for password management and two pinned
&lt;a href=&#34;https://www.fastmail.com/&#34;&gt;Fastmail&lt;/a&gt; tabs, one for personal e-mail and one for
work. I don’t think there’s much else to note there.&lt;/p&gt;
&lt;p&gt;Oh, I use &lt;a href=&#34;https://archlinux.org/&#34;&gt;Arch&lt;/a&gt;, by the way.&lt;/p&gt;
&lt;h3 id=&#34;infrastructure&#34;&gt;Infrastructure&lt;/h3&gt;
&lt;p&gt;This is the hodge-podge of things that support my computer usage but sit outside
the actual computer. In no particular order…&lt;/p&gt;
&lt;p&gt;All my DNS queries go through &lt;a href=&#34;https://nextdns.io/&#34;&gt;NextDNS&lt;/a&gt; using
DNS-over-HTTPS. NextDNS lets you add custom responses, block certain things
from resolving, and subscribe to pre-made anti-tracking or anti-advertising
lists. It gives you far more control over everything than most other services
I’ve looked at.&lt;/p&gt;
&lt;p&gt;Every device I control runs &lt;a href=&#34;https://tailscale.com/&#34;&gt;Tailscale&lt;/a&gt; to enable remote
access. I also use Tailscale’s SSH authentication feature for my servers,
allowing quick and easy access from my phone where I don’t have or want normal
SSH keys.&lt;/p&gt;
&lt;p&gt;One exciting service that combines these two is &lt;a href=&#34;https://github.com/tailscale/golink&#34;&gt;golink&lt;/a&gt;.
It was created by Tailscale, presumably based on the &lt;code&gt;go&lt;/code&gt; service used extensively
inside Google. I run a version on my tailnet, and have NextDNS configured to
resolve &lt;code&gt;go&lt;/code&gt; to the tailscale IP of the service. That lets me type “go/whatever”
on any machine I set up with NextDNS and Tailscale, including mobile devices.
I use go links for all sorts of things:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Shortcuts to tools I use commonly: &lt;code&gt;go/board&lt;/code&gt; gets updated to my current
client’s kanban board or similar tracker, whether it’s in Jira, GitHub, Asana
or whatever; &lt;code&gt;go/meet&lt;/code&gt; goes to Google Meet with the user parameter set
so I’m logged in with my work account not my personal account.&lt;/li&gt;
&lt;li&gt;In place of bookmarks: &lt;code&gt;go/flex&lt;/code&gt; goes to the
&lt;a href=&#34;https://css-tricks.com/snippets/css/a-guide-to-flexbox/&#34;&gt;CSS-Tricks flexbox guide&lt;/a&gt;&lt;sup id=&#34;fnref:4&#34;&gt;&lt;a class=&#34;footnote-ref&#34; href=&#34;#fn:4&#34; role=&#34;doc-noteref&#34;&gt;4&lt;/a&gt;&lt;/sup&gt;,
&lt;code&gt;go/cad&lt;/code&gt; goes to the &lt;a href=&#34;https://www.onshape.com/en/&#34;&gt;OnShape&lt;/a&gt; login page,
&lt;code&gt;go/hmrc&lt;/code&gt; goes to the &lt;a href=&#34;https://www.gov.uk/log-in-register-hmrc-online-services&#34;&gt;HMRC online services&lt;/a&gt;
page, and so on&lt;/li&gt;
&lt;li&gt;A few dynamic things: &lt;code&gt;go/github/chameth.com&lt;/code&gt; will go to the &lt;code&gt;csmith/chameth.com&lt;/code&gt;
project on GitHub; &lt;code&gt;go/ref/pipico&lt;/code&gt; will go to the &lt;a href=&#34;https://ref.c5h.io/view/pipico&#34;&gt;Pi Pico page&lt;/a&gt;
on my electronics reference wiki.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For my servers I have a minimal &lt;a href=&#34;https://www.ansible.com/&#34;&gt;Ansible&lt;/a&gt; setup that
does some basic configuration and deploys SSH keys to the right places. Almost
everything runs inside Docker, and I use my own software for HTTP proxying:
&lt;a href=&#34;https://github.com/csmith/dotege&#34;&gt;Dotege&lt;/a&gt; uses tags I apply to containers to
build a config for &lt;a href=&#34;https://github.com/csmith/centauri&#34;&gt;Centauri&lt;/a&gt; which handles
reverse proxying, using &lt;a href=&#34;https://letsencrypt.org/&#34;&gt;Let’s Encrypt&lt;/a&gt; for TLS certs.
At the minute I have two servers: a dedicated server that runs basically all my
services (including this website), and a little VPS for monitoring and backups.
Both are from &lt;a href=&#34;https://www.hetzner.com/&#34;&gt;Hetzner&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I wrote my own basic monitoring software called &lt;a href=&#34;https://github.com/csmith/goplum&#34;&gt;Goplum&lt;/a&gt;
to make sure things that should be running on my servers actually are. If it
fails checks it sends a notification to my phone using &lt;a href=&#34;https://pushover.net/&#34;&gt;Pushover&lt;/a&gt;,
and a message to a channel on my private IRC server (running &lt;a href=&#34;https://github.com/ergochat/ergo/&#34;&gt;Ergo&lt;/a&gt;).&lt;/p&gt;
&lt;h3 id=&#34;hardware&#34;&gt;Hardware&lt;/h3&gt;
&lt;p&gt;For the last two years I’ve used a laptop as my main computer&lt;sup id=&#34;fnref:5&#34;&gt;&lt;a class=&#34;footnote-ref&#34; href=&#34;#fn:5&#34; role=&#34;doc-noteref&#34;&gt;5&lt;/a&gt;&lt;/sup&gt;. It’s a Dell G15
Special Edition. After some upgrades its specs are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Intel i7-12700H processor&lt;/li&gt;
&lt;li&gt;NVIDIA GeForce RTX 3060 graphics card&lt;/li&gt;
&lt;li&gt;2x32GB DDR5 RAM&lt;/li&gt;
&lt;li&gt;2TB Gen4 SSD&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;At home it sits behind my &lt;a href=&#34;https://www.dell.com/en-uk/shop/alienware-34-curved-qd-oled-gaming-monitor-aw3423dwf/apd/210-bfrq/monitors-monitor-accessories&#34;&gt;Alienware AW3423DWF&lt;/a&gt;
monitor. This is a Quantum Dot OLED monitor, and I bought it almost immediately
upon seeing someone else use it at a LAN event. As did three other people that
were sat near us. It just looks &lt;strong&gt;so&lt;/strong&gt; good. I wasn’t sure I’d get on with
a widescreen monitor, and made sure it supported picture-by-picture before
buying it, but have never actually used that. I generally run whatever I’m
working on at nearly-fullscreen, then have Todoist or Logseq on the far right.
Games go fullscreen over everything, of course.&lt;/p&gt;
&lt;p&gt;Above the widescreen I have a &lt;a href=&#34;https://www.amazon.co.uk/gp/product/B09FHMPFW1/&#34;&gt;curved lightbar&lt;/a&gt;
that I find helps reduce eyestrain and makes it easier to focus on the monitor.
And on top of &lt;em&gt;that&lt;/em&gt; I have a &lt;a href=&#34;https://www.logitech.com/en-gb/products/webcams/brio-4k-hdr-webcam.960-001106.html&#34;&gt;Logitech Brio webcam&lt;/a&gt;
which gives a great picture with lots of control over pan/zoom/etc for meetings.
I have a little set of systemd scripts that detect when the external webcam is
connected and disable the laptop’s built-in webcam, and vice-versa when it’s
disconnected; that means whenever I jump into a video call in any app there’s
only one input and it’s always the right one, which is nice.&lt;/p&gt;
&lt;p&gt;Below the main monitor and its friends, I have a generic 1080p portable monitor
connected to the laptop via USB-C. This comes with me when I travel, and serves
as a Discord/IRC monitor when at home. It’s handy for throwing other things on
as well, like if I need to reference a design while writing code, and don’t
want to keep alt+tabbing.&lt;/p&gt;
&lt;p&gt;I have two &lt;a href=&#34;https://www.durgod.com/product/k320-space-gray/&#34;&gt;Durgod K320&lt;/a&gt;
keyboards: one with Cherry MX Silent Red switches for when I’m at home and don’t
want to annoy people with the sounds, and one with Cherry MX Blues for when I’m
travelling and can make a bit more noise in exchange for a much nicer typing
experience. They’re both tenkeyless so they can handily fit in a backpack.&lt;/p&gt;
&lt;p&gt;I use a &lt;a href=&#34;https://zowie.benq.eu/en-uk/mouse/ec1-c.html&#34;&gt;Zowie EC1-C&lt;/a&gt; wired mouse,
which does the job well. I got fed up with mice from more mainstream manufacturers
failing: my previous mouse was a Razer Viper that lasted 7 months before it
started losing clicks. All my audio goes through a
&lt;a href=&#34;https://uk.hyperx.com/products/hyperx-cloud-alpha-wireless&#34;&gt;HyperX Cloud Alpha Wireless&lt;/a&gt;,
which has the most insanely good battery life of any wireless headset I’ve ever
owned or seen. Their claim of 300 hours is not just marketing!&lt;/p&gt;
&lt;p&gt;In non-computer hardware, I have a &lt;a href=&#34;https://uk.store.bambulab.com/products/p1s&#34;&gt;Bambu P1S&lt;/a&gt; 3D printer
that I’ve mentioned in my blog before. For printing in fewer dimensions I have an
&lt;a href=&#34;https://www.epson.co.uk/en_GB/products/printers/inkjet/consumer/p/30174&#34;&gt;Epson EcoTank ET-1810&lt;/a&gt;,
which is surprisingly reasonable for an inkjet printer, and the ink costs aren’t as astronomical
as normal cartridges. Plus, you can’t decide to DRM ink when it’s loaded raw into the
printer…&lt;/p&gt;
&lt;p&gt;I have a small Zigbee network set up mainly to control the lights and the old
3D printer I no longer use (the P1S has a sensible standby mode so you don’t
have to yank its power away to make the fans stop spinning!). That’s run through
a Raspberry Pi running &lt;a href=&#34;https://www.zigbee2mqtt.io/&#34;&gt;Zigbee2Mqtt&lt;/a&gt; and a custom
app I wrote to monitor events on MQTT and generate the appropriate responses
(or just log the data).&lt;/p&gt;
&lt;p&gt;My daily-driver phone is an &lt;a href=&#34;https://www.apple.com/uk/iphone-15-pro/&#34;&gt;iPhone 15 Pro&lt;/a&gt;,
but I have a bunch of Android devices kicking around for work purposes. I read
nearly every day on a &lt;a href=&#34;https://www.amazon.co.uk/gp/product/B08N2QK2TG/&#34;&gt;Kindle Paperwhite Signature Edition&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&#34;money-and-work&#34;&gt;Money and work&lt;/h3&gt;
&lt;p&gt;I use &lt;a href=&#34;https://www.ynab.com/&#34;&gt;You Need A Budget&lt;/a&gt; for figuring out how much money
I can spend on what, and making sure I have enough put aside for bills and taxes
and so on. I use it for both business and personal accounts together, but I mark
all the business categories and accounts with a 💼 emoji, and have some scripts
that use the API to make sure the money split makes sense&lt;sup id=&#34;fnref:6&#34;&gt;&lt;a class=&#34;footnote-ref&#34; href=&#34;#fn:6&#34; role=&#34;doc-noteref&#34;&gt;6&lt;/a&gt;&lt;/sup&gt;.&lt;/p&gt;
&lt;p&gt;Every recurring monthly and annual payment has a category, as do all upcoming
events I plan to attend, and all the wonderful taxes I have to pay. I also have
categories for hobbies and other expenditure. I think all of that is pretty
typical for a normal YNAB setup.&lt;/p&gt;
&lt;p&gt;I also use YNAB for tracking anything I might like to buy at some point: it
gets a category in a “Wishlist” group, and I’ll occasionally budget to buy
things from there. I try (and often fail) to use that as a way to put off
impulse purchasing. As my income is often very inconsistent, I try to set
aside money so that I can “spend” a bit every week on things in the wishlist
group. That feels a lot nicer to me than just budgeting everything in one go
as soon as I get paid, and gives me more time to consider whether I &lt;em&gt;really&lt;/em&gt;
want those things&lt;sup id=&#34;fnref:7&#34;&gt;&lt;a class=&#34;footnote-ref&#34; href=&#34;#fn:7&#34; role=&#34;doc-noteref&#34;&gt;7&lt;/a&gt;&lt;/sup&gt;.&lt;/p&gt;
&lt;p&gt;For work, I do all the more technical accountancy and tax filing and so on
through &lt;a href=&#34;https://www.freeagent.com/&#34;&gt;FreeAgent&lt;/a&gt;. For my fairly straight-forward tax
situation, I can basically manage everything myself using FreeAgent without
paying for an accountant. That does mean occasionally spending a bunch of time
reading tax manuals, but I’d rather fully understand the rules than just follow
advice anyway.&lt;/p&gt;
&lt;div class=&#34;footnotes&#34; role=&#34;doc-endnotes&#34;&gt;
&lt;hr/&gt;
&lt;ol&gt;
&lt;li id=&#34;fn:1&#34;&gt;
&lt;p&gt;The problem with implementing productivity systems or switching todo apps
or anything of that ilk is that it can &lt;em&gt;feel&lt;/em&gt; like you’re being productive by
doing so. It takes a while to realise that you’re not, and actually getting on
with things is better. &lt;a class=&#34;footnote-backref&#34; href=&#34;#fnref:1&#34; role=&#34;doc-backlink&#34;&gt;↩︎&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&#34;fn:2&#34;&gt;
&lt;p&gt;Or just accept that I’ll maybe do them at some point. I kept the labels
vague to try and not make it feel judgmental. &lt;a class=&#34;footnote-backref&#34; href=&#34;#fnref:2&#34; role=&#34;doc-backlink&#34;&gt;↩︎&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&#34;fn:3&#34;&gt;
&lt;p&gt;Including writing this blog post right now. &lt;a class=&#34;footnote-backref&#34; href=&#34;#fnref:3&#34; role=&#34;doc-backlink&#34;&gt;↩︎&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&#34;fn:4&#34;&gt;
&lt;p&gt;One day I will get all the &lt;code&gt;justify-&lt;/code&gt; and &lt;code&gt;align-&lt;/code&gt; options right without
looking them up, but until then… &lt;a class=&#34;footnote-backref&#34; href=&#34;#fnref:4&#34; role=&#34;doc-backlink&#34;&gt;↩︎&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&#34;fn:5&#34;&gt;
&lt;p&gt;This is very normal for developers, but much less common for computer
gamers. I’ll probably go back to a desktop next time I upgrade, as I’m
travelling a lot less. &lt;a class=&#34;footnote-backref&#34; href=&#34;#fnref:5&#34; role=&#34;doc-backlink&#34;&gt;↩︎&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&#34;fn:6&#34;&gt;
&lt;p&gt;I can’t just arbitrarily move money from the business to myself, it has
to be given as salary or a divided etc, which has tax implications. If I budget
“business money” for personal things, then it actually has to be properly
transferred and accounted for before being spent (as I’m in effect budgeting
a future paycheck). It would be cleaner to keep the accounts completely
separate, but I find this way works well for me as I can be a bit more flexible. &lt;a class=&#34;footnote-backref&#34; href=&#34;#fnref:6&#34; role=&#34;doc-backlink&#34;&gt;↩︎&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&#34;fn:7&#34;&gt;
&lt;p&gt;It feels a little like I’m giving myself pocket money, which is a bit
weird, but it’s a lot better than having no “income” for several months when
client invoices fall weirdly or I’m between contracts. &lt;a class=&#34;footnote-backref&#34; href=&#34;#fnref:7&#34; role=&#34;doc-backlink&#34;&gt;↩︎&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
</content>
    </entry>
</feed>
