Recent Posts

Wasat v1.11.0

1 min read; 8 GFI

Another little update to Wasat, this time bumping the version to v1.11.0.

After this morning's change, I made a start on the work I wanted to do on Rogallo and quickly realised that most of what I had planned was better done in Wasat itself. The short version is: rather than maintaining a just-this-session ignore list in the application, it made more sense to handle this in Wasat.

So this release adds an ignore_security_error method to the client that lets you -- for the current session -- ignore a particular type of error for a given host/port pair. This makes for a lot less work needing to be done by the application making use of Wasat. Now it's just a case of1:

from wasat import Client, IgnorableSecurityError

client = Client()
uri = "gemini://expired.example.com/"

try:
    response = await client.request(uri)
except IgnorableSecurityError as error:
    client.ignore_security_error(uri, error)
    response = await client.request(uri)

Obviously, the code in Rogallo is a bit more involved than the above, but that's the gist of it: try the request, if it fails with an error that can be ignored, ignore it and try again.


  1. Yes, I know the await isn't going to work in this example; consider it pseudo-code. ↩

Wasat v1.10.0

1 min read; 11 GFI

Since getting into Gemini, one of my daily rituals has been to tend to my plant in AstroBotany. This morning, when trying to visit there with Rogallo, I was greeted with this:

Expired certificate

In other words: the certificate has expired1. At this point, the error dialog isn't that useful. It's pretty much designed for dealing with capsules that are using self-signed certificates -- where TOFU is being used and so it would normally make sense to just forget and re-establish trust. With an expired CA certificate, the act of forgetting does nothing, it'll just fail again.

While it's technically fine to simply refuse to progress, in this case, it's not exactly friendly to the user. What would be sensible would be to allow an "Ignore" option. This would, I imagine, ignore the problem for the current Rogallo session -- ideally with some sort of indication that the capsule is suspicious at the moment. Also, the dialog that gives you this option should show all the certificate details so the user can make an informed decision.

The issue here is that, until now, Wasat has dealt with security-type problems by raising a single SecurityError exception. Aside from dumpster-diving the description in the exception, there's no way of knowing the nature of the security issue. v1.10.0 addresses this by adding and raising many different exceptions:

  • CertificateExpiredError
  • CertificateNotYetValidError
  • CertificateRejectedError
  • CertificateRevokedError
  • CertificateUntrustedError
  • FingerprintMismatchError
  • HostnameMismatchError

All of these inherit from SecurityError to maintain backward-compatibility.

While this change doesn't alter the way that Rogallo handles this situation right now, it does at least set me up for tackling the work I have planned.


  1. By the looks of things it expired at 2026-10-26T01:52:07+00:00 ↩

Steam Frame with Steam Machine

4 min read; 10 GFI

Back when the whole new Steam hardware ecosystem was announced, I remember there being a fair bit of talk about how one of the benefits of having a Steam Frame and a Steam Machine would be that you could either play some VR games standalone, or when you wanted to play something a bit more demanding, you could stream from your Steam Machine. While a bit expensive if you were creating your setup from scratch, the idea of a PCVR gaming setup that is all based around one ecosystem was very much appealing.

Fast-forward to the drip-feed availability of the Machine and then later the Frame, we ended up with a pair of devices that actually didn't really work with each other... yet. Reddit was, of course, mad at Valve. Personally, while I did end up with both devices, I was okay with this as it was obvious that work was under way to make this a reality and that it wasn't too far off.

Then, yesterday morning, I noticed that SteamOS 3.9 was released. This entry in the release notes caught my eye:

Improved support for Steam Frame wireless adapter

I had about 90 minutes to kill, so I thought I'd give things a go. I updated the OS on the Machine and updated the Frame too. After that, I "unboxed" (it was still in its little paper jacket) the wireless adaptor and plugged it in, and the Machine recognised it right away. At this point, though, it got a little muddled. I wish I'd kept notes of what I was doing, but from this point on I sort of had to make things up as I went along. What I was expecting was for SteamOS, after I'd paired the Frame (something it prompted me to do), to do anything and everything else to get me playing a game, streamed to the Frame, seamlessly. That part didn't happen. There was no prompt to install SteamVR, it wasn't even clear if I needed to or should. I did anyway just in case (and that took a little bit of faff; I seem to remember that a straightforward search of the store for SteamVR actually didn't show it -- but I forget how I found it in the end).

At this point I tried to follow my nose to see if I could get anything working. My intention was to try out Gunman Contracts, which had been very disappointing as a Frame-native experience. Would it run better with the Machine doing the work? Here's what happened when I tried:

  1. First time I ended up with the game running on the Machine, displaying flat on my TV, and with the Frame saying it had timed out.
  2. Second time I ended up with the game running in 2D/flat mode in the Frame.
  3. Third time I finally got it running on the Machine, but as a VR game streamed to the Frame.

I can't remember the steps I took to get there (again: I only had a short amount of time and hadn't thought to make notes as I went), but once I had this going things seemed to work well. As for the performance of Gunman Contracts itself: eh... it was visibly better than native on the Frame, but it wasn't great. I did some tweaking to the settings and eventually got it running in a way that felt pretty responsive.

I feel it's a game that needs a lot more work to make it run comfortably on the Machine, let alone native on the Frame.

One thing I did seem to notice was that it's really tricky to pull up the game's menu while you're playing it. It seems like you're supposed to press down on the d-pad, maybe. But I found that sometimes it was just a press, other times it was a press and hold for a second or so, yet other times nothing worked. I'm left wondering if it's sensitive to your location in the game. I need to do more experimentation there.

Getting low on time, and battery on the Frame, I decided I had to try another game that I really want to be able to play more of again: VTOL VR. That installed and ran up just fine. In no time whatsoever I was up and in the air.

VTOL VR running

Things did get a little confused at this point though. In attempting to take this screenshot, I accidentally managed to do the SteamVR "recentre my view" gesture (press and hold the Steam button on the controller). This resulted in me being sat on top of the canopy and turned through 90 degrees. Now, I seem to remember that there is a way to recentre yourself in the VTOL VR cockpit, but I couldn't remember the button combination off-hand. I also seem to remember there's a way to do it via an MFD menu but, given I was sat on top of the canopy, I couldn't reach that.

So, in conclusion: it does seem that we're now at a point where the Steam Machine and Steam Frame will talk to each other, and you can play games on the Frame where the Machine is doing the heavy lifting. This is good news. On the other hand it does seem like there's a lot of tidying up to be done with this new VR ecosystem, and I suspect that plenty of games need to take the new Frame controllers into account too.

When I next get a chance I'm going to go through this process again, and try and keep notes of what I do and what the results are.

blogmore.el v5.4.0

1 min read; 9 GFI

I've just made a very small update to blogmore.el to fix a small bug, and also to update some deprecated code.

The blogmore-new command inserts the result of expanding a template into the buffer when making a new post, and I've not touched that template since I started writing blogmore.el. This includes not updating it when I switched much of the frontmatter-handling code over to proper YAML parsing. The problem here was that the title didn't get quotes around it, which became an issue if there was something like a : in the title; any subsequent attempt to modify frontmatter properties would throw an error.

So this release ensures that the title and the date get quoted right away. I guess, at some point, I should rework this code so that it uses the frontmatter-handling code to set up those properties and, instead, just uses the template for the main body.

I've also changed all uses of things like when-let and if-let to use when-let* and if-let*. It seems that, as of Emacs 31.1, the former are deprecated.

TIL: XScreenSaver for iOS

1 min read; 8 GFI

Today I learned that there's a version of XScreenSaver for iOS. I haven't used XScreenSaver in years; probably decades at this point. Not because I don't like it or anything; it's just because I've not had a GNU/Linux desktop machine in that long. But the chance to install the app on my phone and scroll through all the different graphics demos is too good to pass up.

Tron Bit

I noticed this because I saw xscreensaver-official/xscreensaver pop up in my feed on GitHub.

Digital Rain

I, of course, added a star to the repo because the owner asked nicely.

Flying Toasters

Now I might have to throw the Mac version on my Macs.

Or, you know, turn one of my older MacBooks into a Linux laptop and use it there (something I keep meaning to do).

Rogallo v3.2.0

1 min read; 7 GFI

I've just bumped Rogallo to v3.2.0. This release has one small new feature and one wee bug fix.

The new feature is something I found myself wanting a short while ago. I was copying some URIs and then turning them back into Gemtext links in another document; after doing that a few times, I realised that it might be handy to extend the "copy URI" facility in the viewer so that there's a "copy URI as Gemtext" version. To this end, I've added gemtext_link.copy_link_as_gemtext as a viewer widget binding, bound to Shift+c by default.

The fix is a small one to how MIME type checks are done. In one particular case, Rogallo wasn't stripping off any parameters where it should have. This is now fixed.

Steam Machine set up

3 min read; 10 GFI

A couple of days ago, thanks to some free time on a Sunday afternoon, I got round to setting up my newly acquired Steam Machine. While I don't have a lot to say about it, I thought I'd note here that the event happened and jot some notes about how it went.

On unboxing, two things struck me: just how small it is, while also how hefty it feels. I'm not a hardware person, as I've mentioned here many times before, so can't speak to the how and why -- but it feels like the whole thing is cleverly and densely packed. Having owned plenty of PCs over the years, especially a lot of towers and mini towers, it was pretty neat to hold in my hands a machine that would put most of them to shame.

I also really appreciate that it can pretty much hide behind a plant pot next to the TV. It's just... there. It's not a feature.

As for setting up, that was dead simple. I pulled the machine and cable out of the box, unboxed the controller that came with it too, plugged an Ethernet cable between it and my router, fired it up and followed the instructions. Logging in was the usual dead-simple QR code scan from the Steam app on my phone.

The only issue I ran into was when setting up the Steam Controller itself. While it worked perfectly with its own puck plugged in, right from the start (so I could do the setup without need for a keyboard and mouse), things didn't go so well when it offered to switch over to the internal puck. When it asked if I wanted to do that, the Pair button (I think that's what it was called) could be pressed but always resulted in an instant error. Then using Retry was an instant error too. I tried a few times, to no success, so then just carried on using the controller's own puck on the end of a cable.

After going through that, it then wanted to do updates on the puck and controller, which I followed. I had hoped that at that point it might repeat the process to move to the internal puck but that wasn't offered as an option.

Once through all that I was all up and running and my library was available. I tried a couple of games and the whole thing felt nice and fast. In fact, it felt like exactly what I wanted: a better-performing Steam Deck that is always plugged into my TV.

After testing a couple of games, I searched online and then dived into the settings and found that, from there, I could swap the controller over to the internal puck. The method for doing this wasn't obviously available in the settings, hence the search online. Annoyingly I can't find the page I landed on, but I seem to remember it simply involved directly plugging the controller into the machine (USB->USB, not connected to the puck) and then messing in the controller settings on the machine.

Overall, while there was that little hiccup, the experience pretty much felt like setting up a console -- which seems ideal to me. As for what I can do with it: the "Great on Machine" tab in my library looks to contain about a fifth of my total library, and a lot of that is made up of games I'm happy to play. I've not paid too much attention to the what and why of the other four-fifths -- I also imagine there are a good few in there that would also work but which haven't had the seal of approval yet.

Would I recommend this to anyone? Eh, if you're a full-on "PC master race" type who loves to build their own kit and cares about the hardware and stuff... I would imagine not. On the other hand, if you're someone who has a reasonable library on Steam and wants a low-to-no-maintenance PC that's almost invisible in your living room: I'd say it's ideal. Sure, the price isn't great, but that's the way stuff is at the moment1. Additionally, you're getting a desktop Linux machine and something that can be tweaked and tailored how you like, if that's your thing.

Next up on my list of things to do with it, aside from playing on it more (currently low-key obsessed with Iron Nest and am also enjoying having more runs in Vampire Survivors), is to figure out the easiest and best way to record video (with audio and voice) and, ideally, also stream to YouTube. Given the nature of the machine (Linux box with gaming UI) I imagine it's as "simple"2 as adding OBS and setting things up. To be fair to the consoles though: this is where they do win just a little; on both my Xbox Series S and my PS5 there are dedicated tools for streaming. I wish the Steam Machine came with similar built-in functionality so I could be extra lazy and also have a setup that is very unlikely to be disturbed by random updates.


  1. Thanks AI, I guess. ↩

  2. As in: likely doable with some tinkering and work. ↩

Recently I found - 9

1 min read; 8 GFI

Introduction

An occasional collection of things I've recently found on the Internet and added to my bookmarks.

DHH Is Way Worse Than I Thought

While a year old at the point of saving this, it's still a pretty good collection of details of problematic things related to DHH. It's only got worse since.

Awesome Steam Frame

An "awesome" list of all sorts of things related to the Steam Frame.

Mach Run

Fun arcade-style flying game that runs well in the browser. A great way to kill 10 minutes.

Hole Punch

A web-based gravity puzzle game.

Gravity Assist

Another web-based gravity puzzle game.

Getting Started With XR in Godot 4.3 Tutorial!

A video tutorial that goes into the basics of getting some VR code going in Godot.

R U STILL THERE?

How well are Reform folk doing after they got jobs they didn't know they had to work at?

You are a tornado

There's plenty of tornado-chasing games out there. Quite a lot of them. Games where you are the tornado... not so many. Here's one.

If you accept something is unethical, its usefulness is irrelevant, isn't it?

A good toot-sized argument against the "both sides balanced" take on the current state of AI use. Or, rather, it's a good argument in favour of the "it's unethical so I won't use it" approach not being stupidly stubborn.

Why is Hacker News like that?

Good essay that goes over the general political feel of Hacker News, and goes into the background of why it is that way.

Free Promotions on Steam

A list of stuff that is currently free on Steam.

Steam Machine (and Steam Controller)

2 min read; 9 GFI

Some might remember that, earlier this year, Valve made the Steam Machine available for purchase. I'd had my eye on one since they were first announced; I had it on my wishlist. Having had a lot of fun with my Steam Deck, I was sure I'd appreciate what was looking to be its bigger sibling (in terms of size and power, if not age).

Also, having had success with buying the Steam Controller, I was all set to sign up for the "lottery" and see if I could get into the queue for a Machine too. But there was a wrinkle: the opening of the window to throw your hat into the ring, and the projected delivery date should you be lucky, coincided with our holiday in the Netherlands. If I'd been successful, delivery would have taken place while I was out of the country1.

Given this, I waited until I got back and then put my name down for a 512GB machine without a controller. Unsurprisingly, I found myself on the waitlist, not a reservation list. So I waited. And waited. And waited. Along with a lot of other people.

Then, last week, I was scrolling through Reddit and saw a few people talking about how they'd left the 512/no-controller list, jumped on the 512/with-controller list, and then got a purchase invitation email pretty quickly; some within minutes, some within hours. After some wondering about this, I decided it was worth a try. What's the worst that could happen? I still have to wait, which I was anyway, or I get the offer to buy and I'm down about an extra £80 because I went for a controller too.

I decided that, just for the laugh if nothing else, I'd go for it. I removed myself from the 512-no-controller list, added myself to the 512-with-controller list, and... within minutes I had a purchase invitation email! Oh shit! Now I have to decide!

So I decided.

Fast forward to this afternoon and...

My own Steam Machine

So, yeah, along with the Steam Frame, that's my toy budget used up for a wee while to come!

I've not had the chance to unbox it yet and likely won't get the chance until the weekend. While, yes, I could be doing it now rather than typing this, I'm rattling this out between routine family duties and unboxing it would not have given me the free time to actually have a proper play.

Once I do get the chance, I'll try and make a point of jotting down my initial impressions.

Hopefully, at some point soon, I'll get to hook it up with the Steam Frame too and see how well they work together. As I understand it, that's still a bit of a "coming soon" thing, with work in progress on the SteamOS beta on both hardware platforms.

So, at this point, I've somehow ended up with a reasonable little Steam ecosystem:

  • Steam Controller (MkII) (times two)
  • Steam Deck
  • Steam Frame
  • Steam Machine

Also, if we're going to throw in Steam hardware of old, I even still own a Steam Link. At this point, I kind of wish I had my hands on a first generation Steam Controller, just to be somewhat completionist.


  1. Ironically, while in the country where the device would ship from. ↩

Rogallo v3.1.0

2 min read; 10 GFI

Rogallo v3.1.0 is now available. This release is in response to a recent user request.

Right from the start of the development of Rogallo, I ensured that any MIME types that the application couldn't handle were correctly handed off to the operating system, to allow it to work out what to do. While it is possible for me to do some work to allow images inline -- something I might explore at some point in the future -- Rogallo doesn't currently support this and, accordingly, when faced with image/jpeg or image/png, etc, it delegates to the wider environment.

The problem, of course, is that the user might not have a tool in their environment that's capable of taking over the duties of downloading an image from a gemini URI and displaying it. So the next best thing is that Rogallo itself offers to download the file for you. With v3.1.0 this is now an option.

If you encounter a MIME type that hasn't already been marked for always opening in an external tool, there's a new Download button.

Download as an option

If selected, you'll be asked for a location to save the file.

The download dialog

To augment this, I've also added downloading support for links in the viewer. It might be, for example, that you've already marked image/jpeg and image/png as MIME types that should always be handed off to the operating system (perhaps you have a GUI-based client such as Lagrange or Major Tom installed and it's configured to pick up the URI and handle it). In that case, you'd never be shown the dialog that would allow for downloading. So now, on the occasion that you do want to download within Rogallo, you can navigate to the link and press d. The download dialog will then appear, and you can save the content of the link that way.

ℹ️ Note

If you want to change the binding for the link-based download, you can use the recently added UI element binding facility to bind gemtext_link.download_link to something else.

For now, at least, the download process is pretty simple. It follows the same approach as acquiring the content of a URI for display purposes, but instead writes it to the file you picked. There's no "download manager" or similar and no sticky "download directory". These are things I might consider adding in the future.