Mostly walking the dogs

Helix Editor

Some brief (and somewhat belated) notes about Helix.

At about just the time I managed an extension for Nova I started using Helix daily; You know how it goes, always with the shiny.

Coming from quite a few years of using Vim there are some things I struggle with or miss:

But some things I really like:

  • The idea of selection —> action over Vim’s action —> selection is great.
  • More consistent and logical keyboard commands if sometimes a little longer: Adding gs, gl and ge to Vim’s gg for instance.
  • The built-in space+f file-name search.
  • The built-in space+/ file contents search.
  • The overlay for shell commands.
  • The default purple theme
  • Sane defaults, a simple configuration file, and most of what you need is built-in

I’m going to keep playing with Helix. Financially it’s going to make more sense than paying for Nova every year; Although really I owe a few years of Vim sponsorship; And I supposed I should sponsor Helix if I do start using it all the time; One day.

Related: If I had a computer I would be doing more to get Pkgsrc’s package updated.

Making do, mending, getting by (redux)

Of sorts, although things aren’t that bad.

I somewhat recently dropped my (now old) new old phone and cracked the screen. It was still usable, but I’d been toying with getting the battery replaced via a third party since it was at 45% battery health, but with the screen broken I’d have to replace that first and at that price might I might as well get a second hand SE 2020 instead. If I had that much money. Which I don’t. So I switched back to my original iPhone SE (85% battery health). I was amazed at how much better and brighter the screen is. I can use Apple Pay without it freezing the screen. It’s so light and small I don’t even notice it in my pocket. The A9 processor is still fast enough. This was the peak of phone technology.

In hindsight I would have not bothered with the iPhone 8, I got that because I anticipated the iPhone SE going out of support, but it actually took a year longer than I thought it would until the latest iOS wouldn’t run on the SE, plus Apple pretty much do support the previous iOS for another year anyway (iOS 15 just got an update so really it’s only going to be right about now as iOS 17 is released that it is unsupported). I’ve decided it can last a little bit longer still and then maybe I’ll have to get something on contract - I’m paying £10 a month anyway for data/minutes/sms, if I got a contract at around £20 a month then that seems really quite reasonable.

My plan for one pair of running shoes a year is not going to work out. I’m not even at six months and I’ve had to re-glue the sole on one shoe and stitch a tear in the upper in the other (to be fair, the tear is exactly where I’ve removed the internal reinforcement cage, because it gave me a blister). I had not factored in all the dog walking, and what’s more the shoes getting constantly soaked from dewy grass which I’m sure has weakened the uppers. I hope they can keep going a bit longer (more glue, more sewing) and then I think I’m going to try some cheapish Decathlon trail shoes (£40 for the Evadict Easytrail to £60 for the Evadict TR2) which can do the combo of road, trail and dog walking; I slipped over at the weekend on a muddy trail run in my “road” shoes so it’s time for something with more grip.

And this was going to be a separate post, but actually there isn’t that much to say so it makes sense to be part three here. I’ve sadly given up using Teuxdeux (again) and have switched back to Taskwarrior. It’s going to save me a bit of cash and I wasn’t thrilled with the direction the preview was going in: Function over fashion, whereas I really appreciated the fashion of Teuxdeux, if I want pure functionality… well, there’s Taskwarrior. Since I last used Taskwarrior the bugs that impacted my reports have gone so I don’t need any wrapper scripts, etc and I can have simple reports like so:

#Custom report - Teuxdeux
report.teuxdeux.description=TeuxDeux style
report.teuxdeux.filter=(status:completed or status:pending) and due.after:sow-1min and due.before:eow and -BLOCKED

#Custom report - Teuxdeux
report.roll.description=TeuxDeux rolling
report.roll.filter=(status:completed or status:pending) and due.after:-2days and due.before:5days and -BLOCKED

I am trying to use it mostly like Teuxdeux, but with:

  • annotations for links, etc instead of markdown in Teuxdeux
  • sometimes using tags instead of short prefixes like I would in Teuxdeux

I.e. just keeping it as simple as possible. I also resurrected my crontab entry for rolling over incomplete todos.

I never finished off updating Haskerdeux for the new Teuxdeux API, but using Taskwarrior means I could easily update my Apple Watch shortcuts so I can once again see and complete todos from my watch. I thought about setting up a sync server, but I might as well just have my home todos on my server and my work todos on my work laptop and separate things that way. Simple.

[EDIT: 2023-10-30] Turns out the daylight saving bug is still there in Taskwarrior. Almost nine years since I provided a patch. For now I’m not going to update my patch and rebuild from source because I’m using on my work macOS machine and my NetBSD server so it’s easier just to use the binary. I’ll just modify tasks after daylight savings occur using task $(task +TEMPLATE uuids) modify due:'due + 1 hours', etc; At least I just use recurrence.limit=1 now; I did think about just setting my recurring tasks to midday, but this other old bug screws up my report grouping.

LINK: Rip Bram Moolenaar

A few days late mentioning and linking to this, but what a legacy to leave.

When I first started using Vim it took me so long to learn h,j,k,l over the cursor keys that I thought I would never get it, but now it’s ingrained: I use Vim mode in Nova, Vi mode on the command line, etc. And It’s jarring when I can’t*. And I know that’s technically more Vi than Vim, but I would have never have learnt Vi if it were not for Vim.

Anyway, I emailed Bram once and he replied far more quickly than I ever manage to and was amazingly gracious in just a few lines. I did feel suitably awed and humbled.

* - Related, I’ve been playing about with Helix which I actually really like, but it’s so hard unlearning x for d, etc.

LINK: Groovy Extension For Nova

Has taken me three months to do this (obviously not full-time) and all I’ve really done is cobble together other people’s hard work. It’s just so hard to find the time to do stuff, even when some of this I could almost semi-legitimately count as “work”.

Not much to say about it because it’s not wonderful, but:

  • Not over-joyed at a JavaScript based extension system. But Panic do have great docs and tools and the experience of developing and submitting within Nova is pretty cool.
  • I’m really struggling to wrap my head around tree-sitter. I think I need to work through a really basic example so it begins to make sense to me, but… finding time.
  • And similarly, the highlights.scm. I don’t quite get that yet either, but in writing this post I’ve just discovered the Syntax Inspector which should help me a lot (I guess in general I just need more time to read docs).
  • Groovy itself I don’t mind just because it’s something different from Go and Python.
  • Jenkins I hated (say compared to Tekton) until I learnt about JobDSL and that is pretty cool.

Github and not Fossil because Nova has built-in Git support so it just makes life easier… hmmm… maybe I should build a Fossil extension?!

Still Computerless

It’s my one year anniversary of being Computerless. When we moved house we were downsizing a lot. Based on where we thought things we going in the new spot there was no room for my desktop computer as the family one would have to go on that desk instead; For unknown reasons the built-in office was not to be my office and instead I’d be in the utility room with the dogs; Of course the family computer did eventually end up in the “office” so in hindsight I would have had room for my desktop on my desk; Ach.

Anyway, since I didn’t actually have a functioning desktop at that point, just a monitor and keyboard, and since there wasn’t going to be room for them anyway it meant there was no point bringing them - we were also moving most of the stuff ourselves so anything that reduced the number of journeys back and forth had to go. That meant farewell my stereo I had for over twenty years, farewell to a lot of cameras, even farewell to the middle length headphone cable I never used.

So I completely understand having to go without a computer for a bit (moving also cost us a fortune so we had no money spare at the time), but I don’t really get how it’s now a year later and I’m still without one. I really want to be able to do some personal programming projects again. Work is converging to “boring”: Python and Golang. And yet there are so many other programming languages I’d like to dabble in.

This is going to be rectified at some point this year. After all, I’m not after anything fancy, a refurb Thinkpad X250 or X260, which will work well with NetBSD, is easily do-able for between £100 and £200.


Of course, yes, I have shared access to the family computer. I mostly just get to use that for family finances.


I feel like I have to write something. Compose was officially End of Life on 1st March, but only at the end of April did it actually stop being my full time job. And I was still making production code changes (believe it or not!) at the start of May. And this weekend finally marked the end of me being on-call for it (something like an 8184 hour shift - not too shabby).

I joined Compose just under a year after the acquisition (sad I have to link to the way back pages) and perhaps this was more significant to me than others because it was when I officially crossed over from mechanical engineering to software engineering (despite unofficially doing bits and pieces for years). I suspect not though. I think there really was something special about Compose.

I don’t really know how much I am allowed to say so will try to keep it brief:

  • Best job I ever had (I suppose technically still is).
  • I absolutely cannot claim to have built the place or come up with the idea. I can, however, say, without any doubt, that I kept the place running until the very end.
  • Some incredibly talented people worked there and I learned a lot from them and feel emotional attachments to some folk that are of a strength that would probably scare them. I miss folk that have moved on a LOT.
  • Compose never put anyone in a box and I loved this. Sure you had your “team” but nothing was “not your job”.
  • There was some kind of plan there behind the acquisition and with a transition that lasted eight years IBM definitely did not “Our Incredible Journey” Compose. Ok, it probably didn’t work out how anyone thought it would, but they didn’t just buy it and shut it down.
  • In fact, the transition was so gradual that from an insiders point of view I would liken it to boiling a frog. I am that frog. But somehow still alive.

I would love to write more about the pros and cons of the technologically behind Compose versus that behind the replacement offering, IBM Cloud Databases (because it would be really interesting), but pretty sure that crosses the line of stuff I’m not allowed to talk about though.

Given the timing of the End of Life I’m going to count myself as very, very lucky that I didn’t end up resource actioned. Instead I get to carry on fixing broken things and playing about with databases.

LINK: Pkgsrc Wip Package For Libvips Updated To 8.14.1

About all I can manage at the moment as far as open-source “contributions” go (packaging up someone else’s hard work).

Libvips switched to the meson build system with 8.14. I can’t say I’m a huge fan, I prefer the simplicity of autotools, but fortunately switching over was much easier than I thought (even doing all the changes via my phone) thanks to a bunch of other hard work by others.

It irks me that my markup is wrong in the commit message and I can’t ever change it.

Succumbed To Dovecot

I finally succumbed and set up Dovecot on my server. I still profess that (remote, using a tmux session) mutt straight into a (postfix) maildir is the ultimate email experience, but now that I’m back to my main computing device being a phone it has become a pain in the arse using mutt via a teeny tiny terminal on my phone (how on earth I ever did so much on my iPhone SE before this I don’t know). I.e. writing emails is not a great experience and I rarely sort through and archive/delete stuff from my phone, instead waiting until I can get on the family computer.

Setting up Dovecot via a teeny tiny terminal on my phone was one of the reasons I put this off so long, but I had enough snippets of free time over the holidays to persevere and do it.

I used this old NetBSD guide as a basis with a few tweaks to suit the peculiarities of my setup:

  • dovecot.conf

    I just need this protocol:

      protocols = imap
  • ./conf.d/10-auth.conf

    For the time being, I’m including auth-static instead of auth-system. More on that in a bit.

  • ./conf.d/10-logging.conf

    The default didn’t seem to log anything for me and so since I was debugging connections I set:

      log_path = /var/log/dovecot


      auth_verbose = yes
  • ./conf.d/10-master.conf

    The postfix smtp auth bits per the article (“Just follow the provided instructions”) since being able to send email is useful too.

  • ./conf.d/10-ssl.conf

    Pointing ssl_key and ssl_cert at my Let’s Encrypt certs and setting:

      ssl = required

    Instead of yes

  • ./conf.d/auth-static.conf.ext

    For now at least, since my server is effectively single user with just my email on it, I’m using the static auth settings. This feels wrong, but I can’t actually think why this is worse than using system auth (PAM)… yet. I did use doveadm to encrypt a long random password though so it isn’t stored in the file as plain text (not that it really matters anyway, perhaps if this was a shared machine).

      passdb {
        driver = static
        args = password={SCHEME}[REDACTED]

    I have email for two domains on my host so my userdb looks like:

      userdb {  driver = static
        args = uid=999 gid=99 mail_location=maildir:/path/to/Mail/%u:LAYOUT=fs:INBOX=/path/to/Mail/%u/Inbox

    My postfix setup is using the “filesystem” maildir layout - I can’t remember doing that on purpose so I presume it was the default when I set it up. I also had to include the INBOX arg as otherwise I got all my other folders mapped, but no actual inbox.

    With this setup, since the username isn’t used for static auth, I use the domain as the username in my client and it maps to the right mailbox. I could (should?) tweak that so the username is the email address and then pull the domain from that, but it doesn’t really matter.

I will see how this goes, keep an eye on the logs and perhaps think of further ways to lock it down; Maybe limiting number of clients or perhaps only running Dovecot when I need it.

Controlling Postfix Outbound IPv6 Address

Continuing from this Static IPv6 post I discovered that my outbound emails were still sometimes going from the wrong IPv6 address and therefore being flagged as Spam. I had thought using a different sub-domain for that IP and then using these:

myhostname =
smtp_helo_name =

would be enough, but nope. The secret is explictly setting the IP address for smtp:

smtp_bind_address6 = 2a01:7e00:e000:35b::1

Hopefully I finally have it working properly now. Life sure would be easier if I wasn’t bothered about IPv6 and hosting my own email.

I don’t know why, but it feels weird including actual IP addresses and domain names in a blog post even though they are very much public

Static IPv6 for NetBSD on Linode

SLAAC thanks to dhcpcd makes IPv6 very much magical and generally having working IPv6 on NetBSD is a piece of piss; IPv6 at home was easy for instance.

However, when it doesn’t “just work” troubleshooting IPv6 seems immeasurably more complicated than IPv4 - for sure due to my lack of networking competency, but still.

Awhile back I had run into issues sending email from my Linode over IPv6 and had to get a separate 64 range. That had worked swimmingly for almost two years and then out of the blue IPv6 stopped working. I don’t think it was due to a reboot since I’m sure it was working after I resized, but I do now know my configuration in the Spamhaus post was wrong so perhaps it was broken even longer than I thought; However, in my recent troubleshooting I couldn’t even get the SLAAC address to work with autohost when it should have, so who knows?

I came so very close to throwing in the towel and deleting all my IPv6 DNS.

I had been reading through the Linode Linux Static IP Configuration guide and trying to translate that to NetBSD. I thought I had everthing in place:

  • All my IPs assigned to the interface, including the SLAAC address and link local as mentioned in various Linode forum posts (that typically I can’t find one example of now to reference).
  • Gateways assigned (I missed the IPv4 one by accident to start with and completely broke things; Had been taking IPv4 for granted).
  • dhcpcd turned off

But still I couldn’t get IPv6 to work.

Finally, thanks very much to this FreeBSD forum post, I realised that the IPv6 gateway needs the interface on it. And with that things started working.

This is my current setup which I am documenting for my benefit so I don’t forget:

  • etc/rc.conf

      # I have this commented out although probably shouldn't. I think perhaps it's the default?
      # This is commented out now:
  • /etc/ifconfig.wm0

      inet6 fe80::f03c:91ff:fe70:e653 alias
      inet6 2a01:7e00::f03c:91ff:fe70:e653 alias
      inet6 2a01:7e00:e000:035b::1 prefixlen 64 alias
      inet6 2a01:7e00:e000:035b::2 prefixlen 64 alias

    The alias are important.

  • /etc/mygate
  • /etc/mygate6


The good thing about this is I can also do sudo etc/rc.d/network restart and it doesn’t kill my connection.

On a related note… amongst all this (since I was rebooting things a LOT in the vain hope it would just start working again) I finally visited para-virtualisation again but it only seems to recognise the first disk and since I have three that’s not going to work for me so I’m sticking with full virtualisation.

These are the ten most recent posts, for older posts see the Archive.