atomicules

Mostly walking the dogs

Garmin Forerunner 55 Vs Apple Watch Series 3

Garmin Forerunner 55 Vs Apple Watch Series 3

No one is buying either of these in 2026*. Unless you are me. And you got a Forerunner 55 for £60 on Vinted. So these are just observations and notes for my benefit really.

  • It turns off and on so quickly! To be fair, I didn’t often need to restart my Apple Watch and have only got in the habit of restarting the Forerunner after charging because of this bug.
  • I can almost do my base level of exercise and charge once a week going from 80% to 20% battery.
  • On that note, it’s a little depressing that I got this so I had the battery to do longer runs again and immediately injured my knee doing a 30k. Fortunately my knee is much better now and I’m back at half-marathon distance already.
  • WormNav is pretty cool. I have found an issue where it appears to get a GPS lock, but then isn’t actually updating or tracking. A restart will help. I suspect where I start might be in a GPS dead spot because I’ve noticed the same issue with Mappily. Mappily is a closer match to WorkOutDoors which is a fantastic Apple Watch App. I’m going to play about with Mappily and Wormnav since there are pros and cons to both: WormNav can have a white background which is very visible, it also refreshes a bit faster; Mappily has a cadence field and having some context (background maps) for the route is very helpful.
  • Buttons are great. I don’t miss a touch screen.
  • The MIP screen is fine for me. I love being able to glance at my wrist and see Pace, Cadence, etc without fully having to raise my wrist.
  • It’s a round display so I’m using a round watch face, like how on the Apple Watch I used a square one.
  • The heartrate monitor on the Forerunner 55 is a billion times better. I thought the Apple Watch was bad just because it was my wrist. Nope.
  • The Apple Watch is still my favourite Apple product. Being able to run ssh commands and web-browse from your wrist is pretty amazing even if not really necessary.

Since the Series 3 was a couple of years old when I got it I thought of replacing it with an equivalently old device such as a Coros Pace 3 or a Garmin Forerunner 165. I was also interested in “something different” like a Suunto Run or 9 Peak Pro. I.e. watches around £200 new, but that can be found for £150 on Vinted, but then realised there are so many Forerunner 55s it is easy to pick a barely used one up cheap (it seems a lot of people buy them to run a marathon and then discard after one season). It is my price point after all as nothing really changes.

* - Especially since recently Garmin finally replaced the Forerunner 55 with the 70

First decent length run after injuring my knee. Had one full week off and then four weeks of flat-work (no hills) working on my cadence; More on that soon.

Patching the Synaptics driver on NetBSD to disable tap-to-click

This has bugged me since I got a ThinkPad X270, so much so that I actually found/made time for Frustration Driven Development, figured out a patch for the source code, built the kernel and tested it out. This has MASSIVELY IMPROVED my laptop experience. Honestly, not overstating that. Due to the Synaptics driver doing tap-to-click by default I would frequently make mis-clicks with my palm, etc when typing and would often mis-click and accidentally drag tabs, etc in Firefox. I was coming very close to disabling the trackpad altogether and using the pointer instead, but then “solved” half the problem by disabling mouse mode in Helix - although it was still annoying me elsewhere.

I patched it so tap to click is the default behaviour and I can just easily disable via sudo sysctl -w hw.synaptics.tap_to_click=0:

--- /usr/src/sys/dev/pckbport/synaptics.c.orig	2024-06-22 11:02:05.000000000 +0100
+++ /usr/src/sys/dev/pckbport/synaptics.c	2026-04-22 17:21:33.087414774 +0100
@@ -118,6 +118,7 @@
 static int synaptics_button_boundary = SYNAPTICS_EDGE_BOTTOM;
 static int synaptics_button2;
 static int synaptics_button3;
+static int synaptics_tap_to_click = 1;
 static int synaptics_two_fingers_emul = 0;
 static int synaptics_scale_x = 8;
 static int synaptics_scale_y = 8;
@@ -155,6 +156,7 @@
 static int synaptics_edge_motion_delta_nodenum;
 static int synaptics_finger_high_nodenum;
 static int synaptics_finger_low_nodenum;
+static int synaptics_tap_to_click_nodenum;
 static int synaptics_two_fingers_emul_nodenum;
 static int synaptics_scale_x_nodenum;
 static int synaptics_scale_y_nodenum;
@@ -865,6 +867,18 @@
 
 	if ((rc = sysctl_createv(clog, 0, NULL, &node,
 	    CTLFLAG_PERMANENT | CTLFLAG_READWRITE,
+	    CTLTYPE_INT, "tap_to_click",
+	    SYSCTL_DESCR("Enable tap to click"),
+	    pms_sysctl_synaptics_verify, 0,
+	    &synaptics_tap_to_click,
+	    0, CTL_HW, root_num, CTL_CREATE,
+	    CTL_EOL)) != 0)
+		goto err;
+
+	synaptics_tap_to_click_nodenum = node->sysctl_num;
+
+	if ((rc = sysctl_createv(clog, 0, NULL, &node,
+	    CTLFLAG_PERMANENT | CTLFLAG_READWRITE,
 	    CTLTYPE_INT, "two_fingers_emulation",
 	    SYSCTL_DESCR("Map two fingers to middle button"),
 	    pms_sysctl_synaptics_verify, 0,
@@ -1101,6 +1115,10 @@
 		if (t < 0 || t > 3)
 			return (EINVAL);
 	} else
+	if (node.sysctl_num == synaptics_tap_to_click_nodenum) {
+		if (t < 0 || t > 1)
+			return (EINVAL);
+	} else
 	if (node.sysctl_num == synaptics_two_fingers_emul_nodenum) {
 		if (t < 0 || t > 2)
 			return (EINVAL);
@@ -2293,7 +2311,7 @@
 	/*
 	 * Do gesture processing only if we didn't detect a palm.
 	 */
-	if (palm == 0)
+	if (palm == 0 && synaptics_tap_to_click)
 		synaptics_gesture_detect(sc, sp, fingers);
 	else
 		sc->gesture_type = sc->gesture_buttons = 0;

I haven’t noticed any downsides to this at all yet. I have physical buttons that I can use for clicking anyway PLUS it turns out if I press hard enough (I’d never done this because of tap-to-click) on the trackpad it actually physically clicks (and that still registers as a click with this patch).

I must be some kind of freak for hating tap to click (I hate it on macOS as well) since no one has bothered to change this over the years. Or even moaned that much about it.

I couldn’t recall trackpad usage on my previous NetBSD laptop being this bad, but then I looked up that hardware and realised it didn’t have a trackpad.


[EDIT: 2026-05-04] It got committed. Whoop!

Note: But managed my base level of running of 3x 25mins this week. Hopefully on the mend.

Note: Forgot to say, but since the 30k I've had ITB issues on my right knee. Had a whole week off running last week (miserable).

Visiting Virginia

Visiting Virginia

Back when I sponsored the Virginia Woolf statue I didn’t imagine I’d get to see it any time soon - afterall, Richmond is a bit out of the way from Aberdeen. But we were recently down that way so A could finally see Arlo Parks at Circuit in Kingston so we stopped off for a look-around Richmond and immediately stumbled on the statue. I did have a sit next to her.

Note: The Magic Faraway Tree: No magic and tree not really far away. 1/5

Note: Legit album of the year contender.

Note: Managed to pretty much stay off Spotify for first quarter of the year, but had to listen to Teezandos eventually. And. Oh my. Superb.

Where am I running AI in Tmux?

Since using lots of Vim sessions in a terminal I had a brief dalliance with Nova (I did/do like it, but it’s not cross-platform) and then ended up with Helix. At work I tend to use Helix in the same way I was using Vim but instead of Terminal.app it’s Alacritty with one huuuuge Tmux session with multiple windows (“tabs”) per each Git repository I’m working on. I haven’t bothered figuring out renaming the tmux windows automatically and just rename them manually - it tends to be a very long running Tmux session that I also save and restore so renaming manually is a one-time thing. It is easy to find whichever repo I want (across 70+ windows) by using CTRL, b, w to bring up Tmux’s window search and then using / to search for the name I want.

Since starting to play about with AI clis, I’ll split the Tmux window so I have a pane for running the cli in and a pane for Helix. But I won’t be running an AI cli in all of these windows which has lead me to wonder, “How do I find where I’m running AI clis?”.

What I’ve done is add a simple wrapper to the AI cli command to set and unset Tmux window titles on launch and quit of the AI cli:

function ai {
	# Let me know where I'm running an AI cli session
	
	# Find tmux window this command was called from
	# This way can target window. 
	# And avoid racey style stuff where wrong "current window" gets renamed
	twin=$(tmux list-panes -a | grep "$TMUX_PANE " | cut -d : -f 2 | cut -d . -f 1)
	twse=$(tmux list-panes -a | grep "$TMUX_PANE " | cut -d : -f 1)
	# I don't think I'd ever use an asterisk as a window name, but this would fallover if I did
	twnm=$(tmux list-windows -a | grep "$twse:$twin:" | cut -d : -f 3 | cut -d ' ' -f 2 | cut -d '*' -f 1)
	tmux rename-window -t $twin "$twnm + ai"
	/path/to/ai/cli
	tmux rename-window -t $twin $twnm
}

And now I can easily search through my Tmux windows.

LINK: Using Gemini Cli For Software Development

Meant to link to this at the time, but I meant to write my own blog post (see yesterday) before that, but it’s taken me until now to do either; AI certainly isn’t freeing up any spare time in my life.

Playing About With Ai Clis On Netbsd

NetBSD themselves have a no AI policy (fair; at some point lawyers are going to make a mint), but I just wanted to have a play about and since I run NetBSD, perhaps for too long, I just assumed I was out of luck with most AI tooling (most things do just target macOS, Windows and Linux). But it turns out things are mostly ok thanks to all the CLI tooling being node/npm:

  • Gemini just works* (and requires nothing more than a Google account; Which I have again since switching to Android)
  • Codex throws an unsupported platform (I wonder if this could be worked around?)
  • Claude runs (but there is no free tier)
  • Qwen code works (requires a free account; Looks like a Gemini clone)

(Don’t use global installs)

I started with Gemini - I thought I’d jump in the deep end and ask it to do something useful and something fairly complex so I asked it to build me a Chrome Cast receiver in python - I’d love to be able to cast from my Pixel to my NetBSD laptop. It “worked” in that it built something that looked sensible and did run although didn’t actually work when it came to being a Chrome Cast receiver. So then I thought I’d step back a bit and ask it to migrate simplenote.py (long neglected by me) from Travis to Github Actions; Because this is the kind of thing I’ve been meaning to do for a few years and just haven’t found the time for; I.e. this seems like the kind of “chore” task we should be using AI for instead of all the terrible things we are using AI for.

Comparing Gemini with Qwen

For both I gave a prompt like this (apart from the branch name being different):

Create a branch of this repository called gemini-github-actions and migrate the Travis CI setup to Github Actions

And then also gave both permissions for whatever it asked for for the session.

Both gave me additional instructions. Gemini:

To verify the migration, you should push this branch and ensure the GitHub Actions runner can successfully execute the tests and build the package. If you want to proceed with a commit, please let me know.

Qwen:

Next steps:

  1. Add PyPI credentials to GitHub repository secrets (PYPI_USERNAME and PYPI_PASSWORD)
  2. The deploy job triggers on release publication (modern approach vs. Travis’s tag-based deployment)

Personally I find it dumb that neither of them committed automatically (why would I be telling you to create a branch?) so I told both:

Please commit your changes including the summary of the changes you’ve just provided in the commit message.

Qwen had just created the .github/workflows/ci.yml file whereas Gemini also removed the .travis.yml and updated the README badges (nice); However, I LOVE that Qwen co-authored the commit by default.

I told Qwen:

Please also delete the .travis.yml and update the README badges to suit Github Actions ​

to get it in the same state.

(Interesting aside… I had to update my PAT to allow creation and updates of workflows before I could push)

Here’s the final results (final at the time of publishing is one commit on the gemini branch and two on the qwen one):

  1. Gemini
  2. Qwen

There are some subtle differences. Gemini includes many more python versions, Qwen just two, matching exactly what I had for Travis.

Of these two, only the Gemini branch automatically triggered a Github Actions run because it sensibly included its own branch - it failed though on every single job. Don’t actually know why. Github just tells me all the jobs exceeded the maximum execution times whilst waiting for runners.

In an effort to actually publish this post this year I am going to leave the AI efforts there for now - I might continue with both branches and get Gemini and Qwen to make further tweaks or I might continue by hand, but that could take me days, or weeks. Or months. So this will do for now. There’s no conclusions to this post, just observations - literally just me documenting my playing about.

This post has taken me months to write. I’m just too busy. I’ve been wanting to play with AI CLI tooling because up until just the last day or so I’ve not been allowed to use any such tooling at work (believe it or not). At least my tinkering on NetBSD did give me a little bit of a headstart and familiarisation.


* - Worked until this change since that it now gives env: unknown option -- S on NetBSD. Reverting that makes it work again. For me that was these files:

  • /home/me/node_modules/.bin/gemini
  • /home/me/node_modules/@google/gemini-cli/dist/index.d.ts

The whole reason I got a “new” watch (I’ve yet to write a post about this) was so I could try to do runs over two hours again - forgetting that my knees and not watch battery might be the limiting factor. Technically I did it today, the longest I’ve done in five years, although I struggled on the way back. Knees felt ok at the time, but I knew it’d by what they were like afterwards that could be the problem. I am walking a bit like I’m crippled. Hopefully I wake up and everything will be fine.

Undecided if I’m going to try for even further again.

Beautiful.

Spectra

Spectra

Spectra Festival was kind of a washout this year so we only caught the tailend of it and couldn’t be bothered with queuing much. I kind of like this one through the fence of the Kirk though. Belatedly uploaded it, even more belately blogging it - also realised I’d uploaded last year’s and never sorted through them or set them to public. Oh dear.

These are the ten most recent posts (not counting any note drivel), for older posts see the Archive.