Posts from 2026

Wasat v0.3.0

1 min read; 11 GFI

Wasat v0.3.0 is now available. This is a pretty small update, but one that's going to be useful in the next release of Rogallo. I've now got client certificate support up and going in the application, and I thought it might be useful to show the user if a given page is using a client certificate or not (and, perhaps, at some point, make the details of the certificate available as part of some page information dialog).

With this in mind, I've added client_cert_path and client_cert_used properties to the Response class. The former is the path to the certificate used (if one was used), the latter is a simple boolean flag to say if a certificate was used at all.

Of course, client_cert_path could be used for both purposes as it'll be None if one isn't used, but client_cert_used will read better in code if that's all that's needed.

Wasat v0.2.0

1 min read; 10 GFI

I've made a quick update to Wasat, my async Gemini Protocol client library for Python. Now that I'm at a point where I want to add client certificates to Rogallo, I'm essentially shaking down the support for this in Wasat.

One thing I wanted right away was a certificate that, in effect, never expires. So with this release of Wasat I've added an option where the days to expire can be set to None, which results in the expiration date being set to 9999-12-31.

Rogallo v0.5.0

4 min read; 11 GFI

As mentioned in the last release, I've been afk for a week and a bit, enjoying some downtime over in the Netherlands. Although... it wasn't exactly all afk. I did take a keyboard with me and, while time permitted, I did tinker on Rogallo. That's resulted in quite a few TODO items being ticked off, and quite a few changes and improvements being made.

Visible MIME type

It's a small tweak, but I found it useful. The status bar of the main viewer panel now shows the MIME type of the document currently being viewed. Normally it will be showing text/gemini:

text/gemini

but Rogallo can show some other text/ types too, so this will also make it obvious what you're looking at:

text/plain

You might also notice that, depending on the theme being used, the "correct" MIME type gets a "this is fine" colour whereas anything else is in a more "neutral" colour.

Better handling of text/plain and friends

Now, if a document comes in that isn't text/gemini, there is no attempt to parse and render it as Gemtext; it's just shown as a simple block of plain text.

MIME type handling of local files

Given the above changes, Rogallo now makes an effort to guess the MIME type of any local file you view. This should help ensure that only Gemtext files get parsed and rendered as such.

OS hand-off for other MIME types

Where possible, when confronted with a MIME type that Rogallo can't handle, it will attempt to hand it off to your environment's main web browser. While not ideal, I have no wish to turn Rogallo into a terminal-based general content browser/viewer; this is all about Gemini and Gemtext.

History enhancements

The history list has been updated to allow the removal of individual items, and also clearing down the whole history.

Added home page support

It's now possible to set a home page with either a SetHome (which prompts for a URI) or a SetHomeToCurrentLocation (it does what it says) command. There is also a GoHome command that takes you to the home page you've set. The default bindings for all of these can be found by either running rogallo bindings, or by viewing the help screen; pulling up the command palette is also an option.

Added support for bookmarks

Bookmarks are now supported. The ToggleBookmarks will show/hide the bookmarks list. AddLocationToBookmarks will add the current location to the bookmarks. SearchBookmarks lets you search the bookmarks.

More command line suggestions

The completion suggestion facility in the application's command line (where you enter URIs or commands) has been enhanced to include suggestions from the navigation history, the location visit history and the bookmarks. This should make it a little easier to enter a URI you're trying to remember.

Having added the SearchBookmarks command, it made sense to also add a SearchHistory command too. So with that you can quickly search all the locations you've visited (within the limits of the history) and head back to one.

Optimised Gemtext rendering

While not something that should generally be obvious to the user, the Gemtext rendering engine has been optimised a little to reduce the number of Textual widgets used to display a document by consolidating all adjacent plain paragraphs.

Cleaned up quoted paragraphs

I've cleaned up an issue with adjacent quoted paragraphs. Until now there was an empty line between each quote; this spoiled the layout.

View source and ANSI escape sequences

Some Gemini sites use ANSI escape sequences to add colour to pages. While this isn't, as far as I can tell, part of the standard for Gemtext, it's a simple thing to support and so Rogallo has supported rendering this for a while; if a page has colours, they'll be used.

This meant that if you asked to view the source of a page, you'd also see that rendered in colour. I felt that wasn't in the spirit of viewing the source.

So now, if viewing a page like this:

My glower

When you go to view the source, instead of all of the colours still being rendered, you now get to see which ANSI escape codes were used where:

ANSI source

Viewer auto-focus

One small change is that, any time a document is loaded (from bookmarks, history, the command line, etc), the viewer now gains focus. Something I kept forgetting to do and finally I got fed up with having to tab over to the viewer each time.

Content cache

Rogallo now has a content cache for pages loaded from capsules (the aim is to never bother caching content loaded from the filesystem). Any page that is loaded with a success status code (20) gets cached, and when you go back to it, if it's within the TTL of the cache entry (by default set to one hour), the content of the page will be loaded from the cache rather than making a fresh request.

Using the Reload command always bypasses the cache.

There is also a ClearCache command which will delete all cached data.

The TTL of the cache can be changed in the configuration file by updating the value for cache_ttl. Also, if you don't wish to ever use a cache, you can set with_cache to false to disable it.

What's next

With all of the above, I feel this gets Rogallo close to being v1.0.0-ready. Not quite, but very close. The main addition that still needs to be tackled is client-side certificates. I don't anticipate this being too tricky, it's just more a case of needing to play around with the code I've got so far, and needing to think about how to implement it in a TUI-friendly way (if, indeed, there are any considerations there at all).

For now though, as long as you don't need a client-side certificate, there's plenty to play with and try out.

A view of Whitby

1 min read; 7 GFI

I'm back home, back in Scotland, after a touch over a week in the Netherlands. It's been a great week. Much like on the flight out, from the aircraft, I managed to get a view of a part of the UK I like. This time it was Whitby.

Whitby

While likely not immediately obvious, it is there. It was a lot more obvious with the naked eye. Zooming in a bit...

Whitby detail

The track confirms that we were in a good position for such a view:

Track of our flight

While I didn't grab a photo (I wasn't in a window seat this time so it wasn't so easy to keep track of where we were), I also managed to see Scarborough -- a place where I spent many summer holidays as a child in the 1970s.

Sadly I did miss a view of Newcastle, as when we got close to there, we took a left-hand turn and all I could see out of our windows was sky.

Perhaps next time...

textual-enhanced v1.6.0

1 min read; 10 GFI

I've just made a small update to textual-enhanced, my core library used for most of my Textual-based applications. In v1.6.0 I've extended the "constructor" for ModalInput to allow passing in optional values for password, suggester, title and sub_title.

Most of the time I just want to quickly call on ModalInput to get input from the user. If I need anything more fancy, I roll my own dialog. But in some work I'm doing on Rogallo, it would be helpful for me to at least set the suggester. So, without adding every optional parameter for the Textual Input widget, I've extended what can be passed in to what I think will be a useful subset for my applications.

BagOfStuff v1.2.0

1 min read; 10 GFI

Quick bump to BagOfStuff. v1.2.0 adds something I totally forgot yesterday.

While adding the del method to the history classes, to make it easier for me to manipulate them as if they had the interface of a Python list, I totally forgot to add a clear method. Rogallo will need to be able to 100% clear history, as well as remove individual entries in the history, so that's kind of needed too.

It's there now.

BagOfStuff v1.1.0

1 min read; 12 GFI

I've just updated BagOfStuff with a change and addition, in anticipation of some work I'll be doing on Rogallo in the near future. The change is a small and simple one, adding del support to the history classes.

The addition is a simple cache manager. For now it's just a straightforward bit of code that, given a set of keyword arguments, creates a unique hash, sets up a directory, and returns a base filename within it. From there, any calling code can detect if the file(s) exist and make use of it/them, or otherwise get on with some work and populate the cache.

Of course, in the case of Rogallo, this is all going to be used to cache the Gemtext that is retrieved from capsules.

Recently I found - 3

1 min read; 8 GFI

Introduction

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

JSON-LD Explained for Personal Websites

Handy guide to how JSON-LD can be useful for personal websites.

TownSquare

On the one hand, this looks like a fun idea: sort of a Second Life for websites. On the other hand, it's the worst of the Internet, which is no surprise.

The AI Resist List

Does what it says in the title, pretty much.

Rest of the World

A good reminder that tech stories come from places other than the "western" world.

smolweb

A handy guide to all things relating to the small web, and related concepts.

Gemtext Is Not Accessible

A good reminder that, as fun and neat as Gemtext is, it's not terribly accessible.

Honesty gets Emacs patch rejected

The FSF, in effect, does what the FSF is there to do: defend the copyright of GNU Emacs (among other projects). Meanwhile someone attempts to contribute a patch written by a large language model, and seemingly gets offended that it's rejected. I think the worst part about it is they seem to think that being honest about using an LLM should let their contribution in.

The UnOfficial History of Second Life!

A pretty fun Reddit post that contains a potted history of the evolution of Second Life. I've had an account for a good chunk of that time, and it all reads about right to me.

Radial

I've long been a fan of pie menus. I wish macOS had adopted and used pie menus. This looks like something I need to try out at some point.

The AI Compass

It's one of those "compass" type quizzes that works out where you stand on the whole issue of AI. I landed on "The Skeptic".

A view of the Wash

1 min read; 10 GFI

I love flying, even though I rarely do so -- I'm not one for travel. But when I get the chance to fly I find it hard to not just sit there, staring out of the window, marvelling at the view.

Today I got the chance to get a pretty good view of the area close to where I used to live when I first started this blog (and also where I lived when I maintained the blog that came before).

The route I flew actually covered a couple of places from my past life, going fairly close to York (where I was born and spent the first 18 years of my life), then carrying on down into Lincolnshire (where I used to live before moving to Scotland).

The route flown

Much of the route was over broken cloud that made it tricky to really see obvious landmarks, although around Lincolnshire (without knowing I was over it at the time) I did see some shapes in the landscape that looked familiar. Then, after a small turn, and after a wee while, the cloud cleared and suddenly it was very obvious where I was. I had this excellent view of the Wash.

A view of the Wash

I know this sort of thing is conventional, everyday, and boring for many folk. Me: nope, not a chance. That I can have this sort of view is still a wonder to me.

BlogMore v2.44.1

1 min read; 12 GFI

I've just done a quick update to BlogMore, bumping the version to v2.44.1. This release fixes an issue with auto-cover generation where, if you changed some properties relating to a post (or the blog as a whole), the auto-covers weren't being updated to reflect those changes.

A good example is the description of a post. In the editorial-style cover, the description is shown; this is taken either from the first paragraph of the post or, if you've provided a description front matter value, it's taken from that property. The problem was that if you changed the post such that the text of the description changed, after a cover had been generated, it wasn't regenerated because it was already in the cache.

So this release is a bit more aggressive about when it will ignore the cached cover and generate a new one. The result is that the cover will reflect the changes.

There is, of course, a small downside to all of this (which was also an issue for v2.44.0 too): if you're working on a new post in serve mode, any time you change something that causes the cover to be recreated, the older versions of the cover will be left in the cache; in other words, there's a storage overhead to all of this.

For now, I'm just going to live with this downside (BlogMore has a cache clearing command anyway, so if it becomes an issue you can always use that). In the near future, though, I think I'm going to add a smart-clear sub-command to the cache command (or perhaps a --smart switch to the clear sub-command). This will go through the cache and find all the files that aren't currently "valid" and remove them, leaving all the "good" cache entries intact. That should be useful for occasional housekeeping without needing to wipe out the whole cache, and so greatly slowing the next build of a site because every single cover needs creating again, and every single optimised image needs generating again (if you have image optimisation turned on).