Recent Posts

Port79 v0.2.0

1 min read; 8 GFI

A quick update to Port79. When I kicked this off I'd set up the FingerURI class so that it was pretty permissive in what it would accept. So, for example, you could do any of:

>>> FingerURI("davep")
FingerURI('finger://davep/')
>>> FingerURI("davep@example.com")
FingerURI('finger://example.com/davep')
>>> FingerURI("finger://example.com/davep")
FingerURI('finger://example.com/davep')

Nice and handy, right? Accept pretty much any input and turn it into a finger URI. However, once I started to add finger support to Rogallo, I realised that this wasn't as helpful as I'd like as it meant I couldn't use it to actually check for a valid URI. It would be more useful to have the class be strict about only being passed finger: URIs.

So now, the first two examples give an error.

>>> FingerURI("davep")
port79.exceptions.URIError: Invalid URI scheme: ''. Expected 'finger'
>>> FingerURI("davep@example.com")
port79.exceptions.URIError: Invalid URI scheme: ''. Expected 'finger'

Instead, if you want the more relaxed approach, you should use the from_string method.

>>> FingerURI.from_string("davep")
FingerURI('finger://davep/')
>>> FingerURI.from_string("davep@example.com")
FingerURI('finger://example.com/davep')

With this change I can confidently use FingerURI to test if any given input is an actual finger URI, and this also makes it work in a similar way to GeminiURI in Wasat.

An apology from EE

1 min read; 6 GFI

I woke up this morning to find that EE had sent me an email at around 00:30 last night.

We're sorry we didn't stick to our appointment or give you 24 hours' notice that we couldn't make it.

We've added a £32.31 credit to your next bill to try and make up for it.

You don't need to do anything, we'll add it automatically.

If you have any questions, please visit our help page.

And then at 08:17 this morning, I got an SMS:

Hi from EE.

We're sorry for not sticking to our appointment or giving you 24 hours' notice that we couldn't make it. We've added a credit of 32.31 GBP to your next bill. You don't need to do anything, but please go to ee.co.uk/go/compensation if you have any questions. Thanks.

Which is kind of weird, because I remember someone turning up yesterday, and my broadband speed is now 935/107 Mbps at the router (vs. the 35/2.7 it was at the start of yesterday). Perhaps it's their way of saying sorry for the failure to deliver the other day? Who can tell though, it doesn't actually say when and why.

Openreach finally delivered

2 min read; 9 GFI

The day after the last failed attempt to install fibre, I got a follow-up message from Openreach, pretty much not telling me anything I didn't already know:

We came to see if we can connect your property to our Full Fibre network yesterday.

The good news is we can, but the engineer found that the existing network connection point wasn't suitable for private land's underground connection, so we need to plan a new way to bring the fibre cable to your home, which may also require a specialist engineer for a flat roof connection.

We're really sorry for the delay, but we're on it and will update you again in the next 10 days (we're usually much quicker).

We promise Full Fibre's worth the wait. It's the UK's most reliable broadband technology.

The flat roof thing was... interesting, but okay, I'm sure they know what they're doing and that it's some automated system with a restricted set of outcomes.

Skip forward one day and I get an SMS out of the blue:

Hi, it's Openreach on behalf of EE/BT.

Sorry we missed you.

Book a new date for your Full Fibre installation here: [removed]

The "Sorry we missed you" was very odd. They didn't miss me. I saw them two days earlier. But, again, okay... I followed the link and it also seemed to be written as if one of us had missed an appointment and I needed to pick another day. Anyway, I ignored what it said and just used the date picker to pick the next available day (which was today: as in the day I'm writing this).

Fast forward to today and there's a knock on the door at around 08:30. Around two hours later, and this is what I was seeing:

My new speeds

To be clear: this isn't the actual speed of the connection. This was a quick test from my Mac, in my office, via the Wi-Fi connection. I don't currently have a Mac or PC wired into the router so can't measure the full speed. Testing on the router itself, it's much closer to 943Mbps/100Mbps. But, yeah, I'm good. I finally have full fibre again!

There was an immediate downside though. Once it was all set up, with the new router (which I swapped to as it has Wi-Fi 6, so why not?), I noticed that the ping times between my Macs were all over the place; this was also noticeable in that the ssh connections were so jittery to the point of being almost unusable.

Bugger.

So I did a bunch of digging online and, without getting too deeply into it (because I'm not a networking guy): the problem is AirDrop/Sidecar. They don't play well with a Wi-Fi 6 connection, so do stuff in the background that causes your ping times to be all over the place.

The solution? Turn this off for the Wi-Fi connection on the affected Macs:

Wi-Fi 6E off

I can't find anything that suggests I'm going to regret doing this for the couple of Macs in my office, and for my MacBook Air, and having done it, the performance is fine again.

This is why I avoid anything to do with networking: it always seems like if you improve one thing, it degrades some other thing, and it's only ever fixed by remembering to tweak some reasonably obscure setting somewhere on some particular item of hardware.

Still... I HAVE FULL FIBRE AGAIN!

Finally, I can think about doing the odd stream again.

Rogallo v1.0.0

2 min read; 8 GFI

Thirty-three days ago, back on the 18th of June, I created a development directory called rogallo, and started adding dependencies and laying out the main user interface of Rogallo. It's been tons of fun working on it while exploring Geminispace. Given that it's quickly turned into my daily driver, and I'm finding it stable, I've decided it's time to drag it out of the 0verse and consider it worthy of being v1.0.0.

v1.0.0 of Rogallo

I was going to hold off a little longer, mainly because I wanted to flesh out the documentation some more, but that seems like a poor reason to keep it stuck somewhere in v0.x.

To recap, for anyone who might not have followed the development so far: Rogallo is a terminal-based client for the Gemini Protocol. I've built it for my own education. I've built it for fun. I've built it because I want to use it. I've built it hoping that someone else might enjoy it too. Some of the key features, as of this first "stable" release, are:

  • Keyboard-first TUI interface with good mouse support too.
  • Bookmark support.
  • Forward/backward navigation.
  • Location history.
  • Home page.
  • Designed to work on macOS, GNU/Linux and Windows.
  • Trust-on-first-use support.
  • In-application creation of client-side certificates.
  • Full support for user input, both normal and sensitive.
  • Full support for redirections.
  • Context-sensitive help screens.
  • All main application commands available via a command palette or an in-application command line.
  • Themes.
  • Responsive layout that dynamically adjusts to terminal resizing.
  • Support for viewing Gemtext files in the local file system.
  • View source support.
  • Copy-to-clipboard support for URIs or page content.
  • Optionally-numbered links with quick-jump support.
  • Supports ANSI escape sequences in content.
  • Supports filtering out ANSI escape sequences.
  • Emoji filter (lets you remove emojis from most text).
  • Support for handing off unsupported content to the operating system (with safety checks).

Probably some other stuff I've forgotten right now.

On top of this, there's more to come. v1.0.0 isn't the end of the line with Rogallo. I'm having plenty of fun using it, and improving it, and there's more I want to add. I very much want to add in-app support for the Finger Protocol, and I can see myself falling down the Gopher rabbit-hole1 at some point too. While I don't want the application to grow out of hand, I can see plenty of extensions and enhancements that will be satisfying to add.

If any of this sounds interesting and you want to have a play, Rogallo is licensed GPL-3.0 and available via GitHub and also via PyPI. If you have an environment that has pipx installed, you should be able to get up and running with (note that Python 3.12 or later is required):

pipx install rogallo

It can also be installed using uv:

uv tool install rogallo

If you don't have uv installed, you can use uvx.sh to perform the installation. For GNU/Linux, macOS, or similar:

curl -LsSf uvx.sh/rogallo/install.sh | sh

or on Windows:

powershell -ExecutionPolicy ByPass -c "irm https://uvx.sh/rogallo/install.ps1 | iex"

Once installed, run the rogallo command.


  1. Yeah, I agree, probably not the right phrase there. 

Port79 - A finger protocol library for Python

1 min read; 10 GFI

Now that Rogallo is starting to settle down somewhat, with all the main Gemini Protocol work falling into place, I've been thinking about adding one or two adjacent protocols. The two most common and obvious ones are Finger and Gopher. While I'm still undecided about adding the latter, the former seems like a fun one to include (if only because I've had an account on plan.cat for around four years now).

With that in mind, much like I did with Wasat, I wrote a spec for what I wanted and pointed Antigravity at it. The result is Port79. As well as providing a library, there's also a small finger clone CLI, which can be run with python -m port79 (if it's installed as a library) or with port79 (if installed along with any command scripts).

$ port79 davep@tilde.team

hello [removed],

Project:
  Rogallo: https://rogallo.davep.dev/

Plan:
  Currently building gemini://tilde.team/~davep/

Pronouns: he/him

$ port79 davep@plan.cat
Login: davep                            Name: Dave Pearson
Directory: /home/davep                 Shell: /bin/plan.cat
Last login Mon Jul 20 19:06:33 2026 UTC
No Mail.
Plan:
Rogallo v0.12.0, with some more QoL changes:
https://blog.davep.org/2026/07/20/rogallo-v0-12-0.html

To be clear: this isn't intended to be a serious finger command (like, why would anyone even need that?), it's just a tool within the library that can be used to do some testing within a development (v)environment.

At some point soon I'll be adding port79 as a dependency of Rogallo and adding finger as a "native protocol".

Rogallo v0.12.0

2 min read; 9 GFI

I've bumped Rogallo to v0.12.0.

The first change is a simple addition of a !theme command to the command line. As much as possible, I've tried to make sure that every command that's in the command palette can also be run from the in-app command line, but I'd managed to leave this one out. Now you can type !theme and get the theme picker.

Next is the addition of an OpenFile command, bound to Ctrl+o by default. This opens a dialog for browsing the filesystem, allowing for easy access to local gemtext files.

The file opening dialog

Related to this, if you now enter the name of a directory in the command line, the same dialog will open, starting at that directory. Both these changes should make finding local gemtext files a smoother experience.

Another change is to the way that the recently added emoji removal works. I decided that it was a little too aggressive, in that it shouldn't remove them from the content of pre-formatted text. In my experience in Geminispace, so far, pre-formatted text is where the more creative displays happen. Indeed, I had a go at this myself for my new page:

My page, with my image

Here I've used ANSI escape sequences and half-block characters to recreate my usual avatar. The problem is: the emoji-removal approach I've used sees the half-blocks as something to remove. The result isn't great.

My page, with emoji removed

Given that the unwanted emojis will generally be those in body text, links, quotes and headers, I've tweaked the way that pre-formatted text is shown, with it not having emojis removed. I feel this is a sensible approach.

I guess, if anyone really objects to this, I could add a configuration switch that dictates how aggressive the removal is.

The final change is something I wasn't really ever planning on doing, and I felt I'd removed the need for it when I added link stripes. But I got a request to do it and, really, the cost of doing it is nothing. The request? An option to move the link jump labels over to the left.

So now there's a ToggleCosyLinkNumbers command (bound to Super+F8 by default1) which does what it says:

Toggling the jump labels

Personally, I prefer them on the right, where they don't disrupt the left-aligned margin for all the text, but I can see why this would be far more comfortable for others, so... why the heck not?


  1. One day I'll write a post about why I'm giving every command a default binding, even if it's not so accessible in less-advanced terminal emulators. Mostly it's down to one of my least favourite design decisions in Textual mixed with my wish to have a command-based interface that works via the palette first and bindings second. 

Some documentation in Geminispace

1 min read; 8 GFI

Given that Rogallo is coming on pretty well, I feel it's about time to get some sort of documentation for it going in Geminispace. With this in mind, I've created an account over on tilde.team so I can make use of their support for the Gemini protocol.

While I don't imagine I'll be writing documentation as comprehensive as the main site for Rogallo, I do aim to provide some basic information.

The other thing I'm going to maintain there is a version of the change log. Rather than edit it by hand each time, I've added a tool to the Rogallo repository that converts the Markdown version of the ChangeLog into Gemtext.

It looks pretty good in Rogallo.

The Rogallo ChangeLog in Rogallo

Initially, I set all of this up so that I was editing the files via Tramp. This worked fine and got me going, but pretty quickly I decided that it would make more sense to create a repository, edit stuff locally, and then just rsync it when I'm good to go.

Not editing in production... I know... How boring.

Rogallo v0.11.0

1 min read; 11 GFI

A quick update to Rogallo, with changes concentrating on giving the user more control over the content of a rendered page.

Despite the fact that the Gemini Protocol and gemtext are all about things being minimal, some capsules can deliver pretty busy content. Personally, I rather like it, and I'm generally impressed at how creative some people are with these tools. On the other hand, I've noticed that some people don't always appreciate the use of emojis or ANSI escape sequences to provide colour. So, with this in mind, I've added a couple of features to help control the content.

The first is a command to toggle emoji removal. If you're finding the emojis in a page too distracting, use the command to toggle them off and on (bound to F6 by default).

AstroBotany without emojis

The setting is sticky too, so if you're so inclined, you can turn emojis off and they'll stay off.

There's a similar command related to the handling of ANSI escape sequences. While some applications let you toggle this at the capsule level (AstroBotany is one example where it's part of the game's settings), not all do. So I've added a command to toggle this (bound to Shift+F6 by default).

ANSI colour off

With both these commands, if this sort of view isn't to your taste:

AstroBotany and its rich display

You can quickly and easily turn it into this:

Colour and emojis off

I think I prefer the richer view, but I can see the utility of the more austere view.

Somewhat related to the above, I've also added the ability to configure the main "icons" that get used inside the rendered content. So if you don't like the choice of for links within a capsule, for links outwith a capsule, or for a list item bullet, you can change them in the configuration file.

Recently I found - 4

1 min read; 7 GFI

Introduction

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

This blog is written in English

Yeah, it's okay to write in your own voice, and for yourself. Weird, huh?

GitFut

Got to love a stupid GitHub-based profile rating tool.

Lisp hax

Lots of really useful Lisp code. Hours of great reading.

Very Average Prototypes

Interesting article about some of the downsides of working with AI to create code. Says a few things I've also been saying about my journey with BlogMore.

GTA2js

GTA2. On the web.

Half-Life 2 on the web

Half-Life 2. With follow-ups. On the web.

The AI Hype Reckoning Is Upon Us

Good article about the gulf that does seem to exist between the hype around AI in business, and the actual benefits.

Mastodon, The Only Good Choice

Good article about what Mastodon delivers if you enjoy social media.

Please delete your repository

If you had never opened this repository, there is a 21% chance that we would have already cured cancer. Let that sink in.

I don't care if it's totally made up, it made me chuckle.

CSS-DOS

An entire PC built in CSS.

Human Emacs

I feel like this project is jumping the gun quite a bit, but I also appreciate that it exists. I did also see someone say the other day that it was worth running with anyway to "get away from RMS". Which is fair I guess.

Mastodon Most Followed

Because it's all about being popular...

Web Flight

A flight simulator, on the web. What's not to like?

Perfect to mess with during those boring Teams calls...

A Road to Lisp: Which Lisp

Good review of all the Lisp options you have available to you today.

A24 got embroiled in copyright strikes against online creations related to the Backrooms. People, unsurprisingly, got very angry. The issue seems solved, for the moment, but it says a lot about capitalist appropriation of mass-created popular culture.

ZeroVer

Fantastic list of well-known and popular applications that seem too afraid to ever evolve beyond v0.x.

AI Mania Is Eviscerating Global Decision-Making

I feel this so much. I wish the people who need to read this would read this.