<?xml version='1.0' encoding='UTF-8'?>
<rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/" version="2.0">
  <channel>
    <title>davep</title>
    <link>https://blog.davep.org</link>
    <description>Latest posts from davep</description>
    <atom:link href="https://blog.davep.org/feed.xml" rel="self"/>
    <docs>http://www.rssboard.org/rss-specification</docs>
    <generator>python-feedgen</generator>
    <language>en</language>
    <lastBuildDate>Mon, 05 Oct 2026 09:46:53 +0000</lastBuildDate>
    <item>
      <title>Rogallo v3.1.0</title>
      <link>https://blog.davep.org/2026/10/05/rogallo-v3-1-0.html</link>
      <description>&lt;p&gt;&lt;a href="https://rogallo.davep.dev/" rel="noopener noreferrer" target="_blank"&gt;Rogallo&lt;/a&gt;
&lt;a href="https://rogallo.davep.dev/changelog/#v310" rel="noopener noreferrer" target="_blank"&gt;v3.1.0&lt;/a&gt; is now available. This
release is in response to &lt;a href="https://github.com/davep/rogallo/discussions/477" rel="noopener noreferrer" target="_blank"&gt;a recent user
request&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;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 &lt;code&gt;image/jpeg&lt;/code&gt; or &lt;code&gt;image/png&lt;/code&gt;, etc, it delegates
to the wider environment.&lt;/p&gt;
&lt;p&gt;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 &lt;code&gt;gemini&lt;/code&gt; 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.&lt;/p&gt;
&lt;p&gt;If you encounter a MIME type that hasn't already been marked for always
opening in an external tool, there's a new &lt;code&gt;Download&lt;/code&gt; button.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Download as an option" height="948" loading="lazy" src="https://blog.davep.org/attachments/2026/10/05/mime-choices.webp#centre" width="1076" /&gt;&lt;/p&gt;
&lt;p&gt;If selected, you'll be asked for a location to save the file.&lt;/p&gt;
&lt;p&gt;&lt;img alt="The download dialog" height="948" loading="lazy" src="https://blog.davep.org/attachments/2026/10/05/download-dialog.webp#centre" width="1076" /&gt;&lt;/p&gt;
&lt;p&gt;To augment this, I've also added downloading support for links in the
viewer. It might be, for example, that you've already marked &lt;code&gt;image/jpeg&lt;/code&gt;
and &lt;code&gt;image/png&lt;/code&gt; as MIME types that should always be handed off to the
operating system (perhaps you have a GUI-based client such as
&lt;a href="https://gmi.skyjake.fi/lagrange/" rel="noopener noreferrer" target="_blank"&gt;Lagrange&lt;/a&gt; or &lt;a href="https://github.com/acidus99/MajorTom" rel="noopener noreferrer" target="_blank"&gt;Major
Tom&lt;/a&gt; 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
&lt;em&gt;do&lt;/em&gt; want to download within Rogallo, you can navigate to the link and press
&lt;kbd&gt;d&lt;/kbd&gt;. The download dialog will then appear, and you can save the
content of the link that way.&lt;/p&gt;
&lt;div class="admonition admonition-note"&gt;
&lt;div class="admonition-title"&gt;ℹ️ Note&lt;/div&gt;
&lt;div class="admonition-content"&gt;
&lt;p&gt;If you want to change the binding for the link-based download, you can use
&lt;a href="https://rogallo.davep.dev/configuration/bindings/#user-interface-element-bindings" rel="noopener noreferrer" target="_blank"&gt;the recently added UI element binding
facility&lt;/a&gt;
to bind
&lt;a href="https://rogallo.davep.dev/ui/viewer/#available-bindings" rel="noopener noreferrer" target="_blank"&gt;&lt;code&gt;gemtext_link.download_link&lt;/code&gt;&lt;/a&gt;
to something else.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;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.&lt;/p&gt;</description>
      <guid isPermaLink="false">https://blog.davep.org/2026/10/05/rogallo-v3-1-0.html</guid>
      <category>Coding</category>
      <category>Coding</category>
      <category>Gemini Protocol</category>
      <category>PyPI</category>
      <category>Python</category>
      <category>Rogallo</category>
      <category>smolweb</category>
      <pubDate>Mon, 05 Oct 2026 10:13:48 +0100</pubDate>
    </item>
    <item>
      <title>Rogallo v3.0.0</title>
      <link>https://blog.davep.org/2026/10/02/rogallo-v3-0-0.html</link>
      <description>&lt;p&gt;It's been a while since I last published an update to Rogallo. In part this
is because I've had &lt;a href="https://blog.davep.org/tag/steam-frame/"&gt;other distractions&lt;/a&gt;, but also in
part because I've not had a huge need to add any new features of late. For
the most part I feel Rogallo is "done"&lt;sup id="fnref:375-1"&gt;&lt;a class="footnote-ref" href="#fn:375-1"&gt;1&lt;/a&gt;&lt;/sup&gt;.&lt;/p&gt;
&lt;p&gt;I haven't, however, been doing nothing with the code. On and off, over the
last handful of weeks, I've been addressing something that I've wanted to
tidy up since the early days of development: application configuration. The
majority of my &lt;a href="https://blog.davep.org/tag/textual/"&gt;Textual&lt;/a&gt;-based applications use a simple JSON
configuration file, and that's generally good enough. When I started Rogallo
I used the same approach. Rogallo has since grown quite a lot and there's
much that can be configured and so the &lt;em&gt;"honking great pile-o-JSON"&lt;/em&gt;
approach was starting to feel quite untidy.&lt;/p&gt;
&lt;p&gt;So Rogallo v3.0.0 addresses this. The headline change is that the single
JSON file has been replaced with a number of focused YAML files, and some
items that were in the original configuration file have been moved out to
either the data directory or the state directory, depending on their
purpose.&lt;/p&gt;
&lt;p&gt;Now for some details on the changes.&lt;/p&gt;
&lt;div class="admonition admonition-important"&gt;
&lt;div class="admonition-title"&gt;❗ Important&lt;/div&gt;
&lt;div class="admonition-content"&gt;
&lt;p&gt;There are a lot of changes to how Rogallo is configured. As is mentioned
&lt;a href="#conclusion"&gt;at the end of this post&lt;/a&gt;, Rogallo will make a best effort to
migrate your old configuration to the new format. However, as a
precaution, you might want to think about making a backup copy of your
&lt;code&gt;configuration.json&lt;/code&gt; file before upgrading Rogallo.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="focused-configuration-files"&gt;Focused configuration files&lt;/h2&gt;
&lt;p&gt;As mentioned above, whereas before Rogallo kept all of its configuration in
a single file, it now looks to a number of different YAML files that focus
on a different aspect of configuration. These include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;aliases.yaml&lt;/code&gt; - &lt;a href="https://rogallo.davep.dev/ui/command-line/#aliases" rel="noopener noreferrer" target="_blank"&gt;Aliases for the Rogallo command
  line&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;bindings.yaml&lt;/code&gt; - &lt;a href="https://rogallo.davep.dev/configuration/bindings/#changing-a-command-binding" rel="noopener noreferrer" target="_blank"&gt;Main
  command&lt;/a&gt;
  and &lt;a href="https://rogallo.davep.dev/configuration/bindings/#user-interface-element-bindings" rel="noopener noreferrer" target="_blank"&gt;UI
  element&lt;/a&gt;
  keyboard binding configuration&lt;/li&gt;
&lt;li&gt;&lt;code&gt;gopher.yaml&lt;/code&gt; - &lt;a href="https://rogallo.davep.dev/protocols/gopher/#configuration" rel="noopener noreferrer" target="_blank"&gt;Gopher protocol
  configuration&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;icons.yaml&lt;/code&gt; - &lt;a href="https://rogallo.davep.dev/configuration/icons/" rel="noopener noreferrer" target="_blank"&gt;Configuration of icons used throughout the
  application&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;preformatted.yaml&lt;/code&gt; - &lt;a href="https://rogallo.davep.dev/ui/viewer/#configuration" rel="noopener noreferrer" target="_blank"&gt;Configuration for how preformatted text is
  handled&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;toolbar.yaml&lt;/code&gt; - &lt;a href="https://rogallo.davep.dev/ui/toolbar/#toolbar-configuration" rel="noopener noreferrer" target="_blank"&gt;Configuration for the Rogallo
  toolbar&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="general-configuration"&gt;General configuration&lt;/h2&gt;
&lt;p&gt;For the configuration items that remain, that aren't exactly &lt;em&gt;focused&lt;/em&gt; on a
particular Rogallo feature, &lt;a href="https://rogallo.davep.dev/configuration/general/" rel="noopener noreferrer" target="_blank"&gt;the settings have moved to
&lt;code&gt;general.yaml&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="removal-of-some-application-commands"&gt;Removal of some application commands&lt;/h2&gt;
&lt;p&gt;Rogallo's design is based around the idea of some "actions" being
application-wide commands, and some actions being UI-control-specific. As I
worked through the configuration changes I decided that it was time to
"demote" some application-wide commands to either being UI-control-specific
bindings or just simple configuration properties. With this in mind I've
removed the following commands:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;ChangeCommandLineLocation&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;StripeLinks&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ToggleANSIEscapeSequenceHandling&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ToggleCosyLinkNumbers&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ToggleEmojiRemoval&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ToggleLinkNumbers&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;All but &lt;code&gt;ChangeCommandLineLocation&lt;/code&gt; are now &lt;a href="https://rogallo.davep.dev/ui/viewer/#available-bindings" rel="noopener noreferrer" target="_blank"&gt;keyboard shortcuts specific to
the viewer widget
itself&lt;/a&gt; (press
&lt;kbd&gt;F1&lt;/kbd&gt; when the viewer has focus to get more details).
&lt;code&gt;ChangeCommandLineLocation&lt;/code&gt; is now a &lt;a href="https://rogallo.davep.dev/ui/command-line/#location" rel="noopener noreferrer" target="_blank"&gt;simple configuration property in
&lt;code&gt;general.yaml&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="ui-element-action-keyboard-bindings"&gt;UI element action keyboard bindings&lt;/h2&gt;
&lt;p&gt;From the very start, Rogallo has supported some degree of control over
keyboard bindings. As mentioned above, there's a split between
"application-wide commands" and "UI-element-specific" actions. Until now
it's always been possible to configure the bindings for the former, but
never the latter.&lt;/p&gt;
&lt;p&gt;In other words: you could always configure the binding for the
&lt;code&gt;HandOffToOperatingSystem&lt;/code&gt; application command (hands the URI of the
currently-viewed document to your OS), but you couldn't change the in-viewer
binding for the &lt;kbd&gt;o&lt;/kbd&gt; key, which opens the URI of the focused link in
the OS.&lt;/p&gt;
&lt;p&gt;Rogallo v3.0.0 adds &lt;a href="https://rogallo.davep.dev/configuration/bindings/#user-interface-element-bindings" rel="noopener noreferrer" target="_blank"&gt;support for changing the bindings of the
latter&lt;/a&gt;.
So if you wanted to change &lt;kbd&gt;o&lt;/kbd&gt; to &lt;kbd&gt;b&lt;/kbd&gt; for opening a URI
externally:&lt;/p&gt;
&lt;div class="highlight" data-lang="yaml"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nt"&gt;gemtext_link.open_link_externally&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;b&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;You can find the bindable IDs for each of the UI controls &lt;a href="https://rogallo.davep.dev/ui/" rel="noopener noreferrer" target="_blank"&gt;at the bottom of
each page for each of the controls&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="new-gophermap-badges"&gt;New Gophermap badges&lt;/h2&gt;
&lt;p&gt;Not directly a configuration setup change, but something I noticed while
doing the work, was the fact that Rogallo (and the underlying &lt;a href="https://gophermap.davep.dev/" rel="noopener noreferrer" target="_blank"&gt;Gophermap
library&lt;/a&gt;) didn't handle &lt;code&gt;PNG&lt;/code&gt; and &lt;code&gt;RTF&lt;/code&gt; item
types. They're now directly supported.&lt;/p&gt;
&lt;h2 id="conclusion"&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;I believe all of the above changes make it easier to configure Rogallo, and
more importantly easier to backup and share the configuration. Technically
all of this is one huge breaking change -- everything that was in
&lt;code&gt;configuration.json&lt;/code&gt; now lives elsewhere. However, I've added some code to
Rogallo that detects when you still have a pre-v3.0.0 configuration active,
loads up the values, creates the new files, and then renames the old file to
&lt;code&gt;configuration.migrated.json&lt;/code&gt;. As mentioned near the start of this post, you
might want to think about making a backup copy of &lt;code&gt;configuration.json&lt;/code&gt;
before upgrading.&lt;/p&gt;
&lt;div class="footnote"&gt;
&lt;hr /&gt;
&lt;ol&gt;
&lt;li id="fn:375-1"&gt;
&lt;p&gt;One last big thing I do want to add is support for tabs. Still to come.&amp;#160;&lt;a class="footnote-backref" href="#fnref:375-1" title="Jump back to footnote 1 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</description>
      <guid isPermaLink="false">https://blog.davep.org/2026/10/02/rogallo-v3-0-0.html</guid>
      <category>Coding</category>
      <category>Coding</category>
      <category>Gemini Protocol</category>
      <category>PyPI</category>
      <category>Python</category>
      <category>Rogallo</category>
      <category>smolweb</category>
      <pubDate>Fri, 02 Oct 2026 08:45:01 +0100</pubDate>
    </item>
    <item>
      <title>Virtual Fighter Maneuvers</title>
      <link>https://blog.davep.org/2026/10/01/virtual-fighter-maneuvers.html</link>
      <description>&lt;p&gt;I realise I've been a bit quiet on the blog front for a few days, in part
because I've also been a bit quiet on the coding front too. Looking at my
GitHub contribution graph, the previous three days where I didn't commit
anything are the longest run of no-commit days I've had in about 10 months.
There are a couple of reasons for this: the first is that I've reached a bit
of a natural pause point with &lt;a href="https://blog.davep.org/tag/rogallo/"&gt;my work on Rogallo&lt;/a&gt; (there's a
biggish update brewing, but I've been taking my time with it), the second is
-- as I expected -- &lt;a href="https://blog.davep.org/2026/09/23/steam-frame-is-here.html"&gt;getting my hands on the Steam
Frame&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I haven't been playing with it exclusively -- when I have a good amount of
free time I am &lt;a href="https://www.youtube.com/@DavePearson/streams" rel="noopener noreferrer" target="_blank"&gt;back to
streaming&lt;/a&gt; -- but I have been
dipping in on occasion, and some of those occasions would be moments where
I'd reach for the &lt;a href="https://blog.davep.org/tag/macbook-air/"&gt;MacBook&lt;/a&gt; and bang out some code.&lt;/p&gt;
&lt;p&gt;I'm still not set up for full-on &lt;a href="https://blog.davep.org/tag/pcvr/"&gt;PCVR&lt;/a&gt;, but I have "discovered"
a game that runs really well &lt;em&gt;on&lt;/em&gt; the Steam Frame, and it's one that's
related to &lt;a href="https://www.youtube.com/playlist?list=PLUY2FpMDyORCEqHuAxNrL0WV6GV4RFzZv" rel="noopener noreferrer" target="_blank"&gt;a favourite of mine in
VR&lt;/a&gt;:
&lt;a href="https://store.steampowered.com/app/3952640/Virtual_Fighter_Maneuvers/" rel="noopener noreferrer" target="_blank"&gt;Virtual Fighter
Maneuvers&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Simply put: it's a &lt;em&gt;very&lt;/em&gt; cut-down version of VTOL VR, designed to run well
on standalone headsets. Graphically it's simplistic, and from a gameplay
point of view it's &lt;em&gt;very&lt;/em&gt; focused. There's no single-player campaign.
There's no multiplayer campaign. There's no story at all. You strap on your
headset, fire up the game, jump into a lobby and off you go: dogfight time!&lt;/p&gt;
&lt;p&gt;I love it for that. I've always loved flight sims, and they're even more fun
in VR. I like the slow pace and the sense of immersion. But if you're going
to fly in VR it takes a bit of time to get set up and plan things. This is
the total opposite. I love that I can dive in for 30 minutes, have a fun
experience, and then be done. It's ideal for quick, casual sessions.&lt;/p&gt;
&lt;p&gt;That's not to say I &lt;em&gt;only&lt;/em&gt; want to play for those short bursts -- I have
played longer sessions -- it's more to point out that it's a game that
combines perfectly with the low-activation-energy accessibility of the Steam
Frame. It's a game that makes the Frame feel as easy to pick up as the
&lt;a href="https://blog.davep.org/tag/steam-deck/"&gt;Steam Deck&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Of course, being a mainly multiplayer game, your chances of having a good
time are mixed&lt;sup id="fnref:373-1"&gt;&lt;a class="footnote-ref" href="#fn:373-1"&gt;1&lt;/a&gt;&lt;/sup&gt;. I've been into a couple of lobbies that have been really
fun, with a good mix of folk, who all seem to have joined to have a good
time. I've also joined matches where it's just kids wanting to be edgelords
on the Internet. Thankfully, so far, it's more the former than the latter.
Sadly, though, there don't seem to be that many people playing it. In my (UK
timezone) evenings there's normally, at most, four matches on the go that
you might be able to join.&lt;/p&gt;
&lt;p&gt;There also seems to be a 1v1 matchmaking service so you can get a ranking by
battling folk at a similar level to you (I'm a newb to the game, of course);
I've yet to actually get such a match going.&lt;/p&gt;
&lt;p&gt;This one is a keeper and I can see myself diving into it often for a good
while to come.&lt;/p&gt;
&lt;div class="footnote"&gt;
&lt;hr /&gt;
&lt;ol&gt;
&lt;li id="fn:373-1"&gt;
&lt;p&gt;It does have bot matches too, so you can do some limited single-player gameplay.&amp;#160;&lt;a class="footnote-backref" href="#fnref:373-1" title="Jump back to footnote 1 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</description>
      <guid isPermaLink="false">https://blog.davep.org/2026/10/01/virtual-fighter-maneuvers.html</guid>
      <category>Gaming</category>
      <category>Steam Frame</category>
      <category>VR</category>
      <category>gaming</category>
      <pubDate>Thu, 01 Oct 2026 16:32:09 +0100</pubDate>
    </item>
    <item>
      <title>Initial Steam Frame impressions</title>
      <link>https://blog.davep.org/2026/09/26/initial-steam-frame-impressions.html</link>
      <description>&lt;p&gt;Yesterday evening I finally had the chance to unbox my &lt;a href="https://blog.davep.org/tag/steam-frame/"&gt;Steam
Frame&lt;/a&gt; and have an initial play with it. Here are my
impressions of it after playing for a couple of hours. Note that this
&lt;em&gt;isn't&lt;/em&gt; intended to be any kind of review, just some jotted notes about
things I noticed and concluded. The order might appear a little random too.&lt;/p&gt;
&lt;h2 id="unboxing"&gt;Unboxing&lt;/h2&gt;
&lt;p&gt;The first thing I noticed was the obvious lack of any actual instructions.
Either I missed the obvious, or there was no leaflet and nothing on the box
to tell me how to get it up and running. I had already read online what to
do so didn't have any issues, but this still strikes me as odd. I guess the
Frame isn't intended for the full consumer market and so the kind of
enthusiast who plays with SteamVR is likely curious enough to go find
information or work things out, but it still feels like an odd omission.&lt;/p&gt;
&lt;p&gt;The other thing that feels like a serious omission is the complete lack of
any sort of welcome experience. I remember when I first got my Quest 2, the
introduction app was a whole thing and did a great job of showing off the
hardware. Heck, even the &lt;a href="https://blog.davep.org/tag/steam-deck/"&gt;Steam Deck&lt;/a&gt; has &lt;a href="https://store.steampowered.com/app/1902490/Aperture_Desk_Job/" rel="noopener noreferrer" target="_blank"&gt;Aperture Desk
Job&lt;/a&gt;. It
seems like a very odd choice that something new for the Frame wasn't
created.&lt;/p&gt;
&lt;p&gt;For example, &lt;a href="https://store.steampowered.com/app/450390/The_Lab/" rel="noopener noreferrer" target="_blank"&gt;The Lab&lt;/a&gt;
is a decade old now; it seems strange to me that they didn't refresh it and
promote it as a standalone initial experience for the Frame -- perhaps using
it to show off some of the new capabilities or something.&lt;/p&gt;
&lt;h2 id="comfort"&gt;Comfort&lt;/h2&gt;
&lt;p&gt;While I did buy the ergonomic kit, I didn't set any of that up right away. I
was keen to try the device out so my initial test was without the top strap
in place. While I've since fitted it, and find it a useful addition, I'm
amazed at just how comfortable the headset is to wear. I've spent many
hundreds of hours wearing the Quest 2 and the PSVR2, neither of which was
horrible, but both of them felt uncomfortable after some use. Based on my
initial impressions the Frame feels like something that could be worn for
pretty long sessions without any problem.&lt;/p&gt;
&lt;p&gt;To be clear: The Steam Frame is by far the most comfortable headset I've
worn. This in turn makes it feel like the headset with the least activation
energy required when it comes to being motivated to "jump into VR".&lt;/p&gt;
&lt;h2 id="controllers"&gt;Controllers&lt;/h2&gt;
&lt;p&gt;The controllers are... okay, I guess. Compared to the headset they feel
cheap, which they might well be. Based on my experience with the Quest 2,
the controllers are the things that take the most punishment and so they're
most likely to be the things that need replacing most often. Perhaps
they're designed with the right balance of &lt;em&gt;"last long enough"&lt;/em&gt; and
&lt;em&gt;"affordable to replace"&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;The main issue I have with the controllers is they seem to have crammed too
much into them. They've put all four buttons on the right controller, and a
D-pad on the left controller. Perhaps I'm missing something here but this
feels like overkill. I found that this made the controllers feel far too
busy. All of this also means that the two top buttons (the ones normally
used to pull up menus of some description) feel just out of reach. During my
time playing last night I found I was having to constantly readjust my grip
to reach different buttons, which then meant I was often having to peek
under the headset to actually see where my fingers were landing.&lt;/p&gt;
&lt;p&gt;Honestly, in terms of ergonomics, I'd say the Frame's controllers are worse
than those of the Quest 2, but slightly better than the ones that come with
the PSVR2&lt;sup id="fnref:429-1"&gt;&lt;a class="footnote-ref" href="#fn:429-1"&gt;1&lt;/a&gt;&lt;/sup&gt;.&lt;/p&gt;
&lt;p&gt;There's also the complication of the controller straps that come in the
ergonomic kit. I love these sorts of straps (the kind that goes around the
back of your hand) as they generally make controller use more comfortable.
It's great to not &lt;em&gt;have&lt;/em&gt; to keep gripping the controller all the time, and
it also feels more natural if you need to throw something in VR. But it
really feels like whoever designed the controller layout never spoke with
whoever designed the straps. The combination ends up being pretty awkward.&lt;/p&gt;
&lt;p&gt;I've never used the &lt;a href="https://store.steampowered.com/app/1059550/Valve_Index_Controllers/" rel="noopener noreferrer" target="_blank"&gt;Index
controllers&lt;/a&gt;,
but everyone I've spoken to who has always seems to sing their praises.
Based on that, the Frame's controllers feel like they can't have come from
the same company.&lt;/p&gt;
&lt;h2 id="inside-the-headset"&gt;Inside the headset&lt;/h2&gt;
&lt;p&gt;I've read a good few comments from people on Reddit that say that the
display in the headset is pretty dark. That wasn't my experience at all. Out
of the box I found the display bright enough, and that wasn't even turned up
as high as it will go.&lt;/p&gt;
&lt;p&gt;The other thing I found was that the display felt like the clearest one I've
tried out yet. I wear glasses; I'm short-sighted and have an astigmatism
that needs correcting. Given the design of the headset there's no way I was
going to wear my specs while using it, so for the moment I'm playing
unaided&lt;sup id="fnref:429-2"&gt;&lt;a class="footnote-ref" href="#fn:429-2"&gt;2&lt;/a&gt;&lt;/sup&gt;. Despite that I found the display very readable (to be fair, I'm
not &lt;em&gt;that&lt;/em&gt; short-sighted).&lt;/p&gt;
&lt;p&gt;What is slightly disappointing is the lack of an actual "home" when you boot
up the headset. This feels like a missed opportunity. Like, sure, the
floating menus and the stark landscape are fine and do the job, but the
actual home to exist in always felt like a fun thing. Even the Quest 2 has
this -- surely it could be done on the Frame?&lt;/p&gt;
&lt;h2 id="audio"&gt;Audio&lt;/h2&gt;
&lt;p&gt;I really like the audio. My VR audio experience comes from the stock Quest 2
and also stock PSVR2. The Frame is obviously very similar to the Quest 2, in
that the speakers are "near" your ears but don't cover them in any way. I
like this. I like this a lot. I find this a really comfortable way to
experience VR (and, while it's not an issue at the moment, the ideal setup
for recording your voice for video-making or streaming purposes -- you're
less likely to end up shouting). I've never liked the PSVR2 in-ear buds so
I'm glad it's nothing like that.&lt;/p&gt;
&lt;p&gt;While playing, I found that the sense of direction of sounds was pretty spot
on, which is something that very obviously matters to immersion. That level
of immersion, combined with an awareness of your own surroundings, feels
like just the right balance.&lt;/p&gt;
&lt;h2 id="battery-life"&gt;Battery life&lt;/h2&gt;
&lt;p&gt;The battery life is not great, it has to be said. I think I got something
like 40 minutes out of the device when I first booted it up. In all
fairness, I can't remember what level it was on to start with, and I was
also doing an OS upgrade, controller update, and the installation of a game
or two.&lt;/p&gt;
&lt;p&gt;The second part of my initial session started with something like 95%
battery available. That second session ended up on about 20% battery left
after playing Alyx for the better part of an hour, give or take (I didn't
make a point of actually timing it).&lt;/p&gt;
&lt;p&gt;I feel like, with a full charge, and depending on what I do, I might get
around 90 minutes out of the device. This feels less than I'd get out of the
Quest 2 back in the day.&lt;/p&gt;
&lt;p&gt;All of this was, of course, playing a game locally on the headset itself. It
will be interesting to see how it compares when in PC-based PCVR streaming
mode using the supplied dongle.&lt;/p&gt;
&lt;p&gt;Given my interest in using this mostly in standalone mode, I can see myself
buying an external power unit and hooking it up while it's stuck in a pocket
or something.&lt;/p&gt;
&lt;h2 id="ergonomic-kit"&gt;Ergonomic kit&lt;/h2&gt;
&lt;p&gt;The ergonomic kit feels like a thing that should have been included in the
price, if I'm honest. The additional strap for the headset is, as I
mentioned above, nice to have and improves the comfort from comfortable to
very comfortable. The straps for the controllers feel a little cheap but do
the job.&lt;/p&gt;
&lt;p&gt;I've not tried out the nose guard thing yet. There's no doubt that a &lt;em&gt;lot&lt;/em&gt;
of light leaks around the nose, but at the same time that's actually quite
handy for quickly glancing at the world around you if you need to be able to
check on something (your phone, or where your fingers are on the controller
because of the issues I mention above).&lt;/p&gt;
&lt;p&gt;Now, this might just be me being a bit dense: I found the instructions that
came with the kit kind of confusing when it came to the controller straps. I
got there in the end, but I feel like the visuals printed on the box could
have been &lt;em&gt;so&lt;/em&gt; much better.&lt;/p&gt;
&lt;p&gt;Thankfully my kit was complete. I've seen reports of people finding broken
parts, missing parts, or things like two right-handed controller straps
rather than a left and a right.&lt;/p&gt;
&lt;h2 id="gaming"&gt;Gaming&lt;/h2&gt;
&lt;p&gt;For my initial session I only played games standalone. While I do have a PC
for PCVR purposes, it's still packed away after my move last year. I will
drag it out and give it a go at some point, but the standalone gaming
abilities are what interest me most at the moment.&lt;/p&gt;
&lt;h3 id="gunman-contracts-stand-alone"&gt;Gunman Contracts - Stand Alone&lt;/h3&gt;
&lt;p&gt;The first game I decided to try out was &lt;a href="https://store.steampowered.com/app/2421750/Gunman_Contracts__Stand_Alone/" rel="noopener noreferrer" target="_blank"&gt;Gunman Contracts - Stand
Alone&lt;/a&gt;.
While the &lt;em&gt;"Stand Alone"&lt;/em&gt; in the name is in reference to it no longer being
a mod for Half-Life: Alyx, my understanding is that it is intended to be
playable standalone on the Steam Frame.&lt;/p&gt;
&lt;p&gt;It isn't. It so very isn't.&lt;/p&gt;
&lt;p&gt;The FPS was horrible, and I noticed lots of graphical distortion as I tried
to play. I never made it out of the home bunker as the whole thing was just
a laggy mess.&lt;/p&gt;
&lt;p&gt;This doesn't surprise me though. Based on other reviews it looks like it's
not the best experience even when playing in full PCVR mode. I've also
played it flat-screen on the Steam Deck and it's okay there, but obviously
needs some work.&lt;/p&gt;
&lt;p&gt;I will revisit this, as I noticed in the settings for it that everything
seemed to be turned up to the max. Textures were on &lt;em&gt;Ultra&lt;/em&gt; for example,
which seems like a wild choice out of the box for a game running on a
standalone VR headset. Given this I'm going to assume the game makes zero
effort to detect the environment it's running in and to configure good
defaults.&lt;/p&gt;
&lt;h3 id="gun-club-vr"&gt;Gun Club VR&lt;/h3&gt;
&lt;p&gt;Next up I tried &lt;a href="https://store.steampowered.com/app/691320/Gun_Club_VR/" rel="noopener noreferrer" target="_blank"&gt;Gun Club
VR&lt;/a&gt;. This is a game
I've played before native to the Quest 2, and also in PCVR. Given it's an
older game I had high hopes for it. I was right to. This was pin-sharp and
buttery smooth. In terms of how it looked and felt in the headset it was
night and day compared to Gunman Contracts.&lt;/p&gt;
&lt;p&gt;Sure, I'm comparing apples and oranges there in terms of game age and what's
being asked of the hardware, but I think it's a good comparison of the
different ends of that spectrum.&lt;/p&gt;
&lt;p&gt;While Gunman Contracts left me concerned that a lot of VR gaming would be
off-limits on the Frame, Gun Club VR gave me hope that many of the classics
will run well (perhaps after some tweaks by the authors).&lt;/p&gt;
&lt;h3 id="half-life-alyx"&gt;Half-Life: Alyx&lt;/h3&gt;
&lt;p&gt;The third and final game I tried out was Half-Life: Alyx. I've &lt;a href="https://www.youtube.com/playlist?list=PLUY2FpMDyORAiNuu3K9NXzAVAgUJs-0sA" rel="noopener noreferrer" target="_blank"&gt;played this
in full PCVR mode
before&lt;/a&gt;,
and do feel it's pretty much the peak VR experience. The idea that this
could work standalone was wild to me. I know Valve have worked hard on
making it work, and are promoting it to the point of bundling it with the
Frame&lt;sup id="fnref:429-3"&gt;&lt;a class="footnote-ref" href="#fn:429-3"&gt;3&lt;/a&gt;&lt;/sup&gt;, but it still felt like it was going to be a bad time.&lt;/p&gt;
&lt;p&gt;It wasn't a bad time. It was a good time.&lt;/p&gt;
&lt;p&gt;While it's very obvious that the graphics have been dialled down, and while
I did see a fair bit of pop-in of assets from time to time, generally it
looked good and performed well. In my peripheral vision I could obviously
see that the resolution was super-low, but no matter where I was directly
looking, I saw a quality image (presumably eye-tracked foveated rendering at
work, although I've not checked if it is used in Alyx). There was almost no
stutter, no lag to speak of, and it felt as good as I remember when playing
it in full PCVR mode.&lt;/p&gt;
&lt;h2 id="conclusion"&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;Overall my first experience is pretty positive. Out of the box the Steam
Frame is the most comfortable VR experience I've had yet. Given I'm writing
this just one week after getting the purchase invitation email, I have high
hopes for this device. It seems obvious that there's a load of software and
firmware improvements to come, and I can imagine a good third-party market
of add-on products to augment the use of the headset (mics, headphones, care
and storage, power without full tether, etc.). I also imagine there will be
a scramble to optimise a good number of VR games and experiences to get them
working well standalone.&lt;/p&gt;
&lt;p&gt;It is, without question, expensive for what it is. I very much doubt that
this was Valve's intention or doing. The demand for various types of
hardware is having a broad impact and I don't need to detail that. Taking
this fact into account, this feels like a great little product that's only
going to improve with time.&lt;/p&gt;
&lt;p&gt;While I'm not sure I'll return to recording VR videos again, at least not
with the frequency I used to, I &lt;em&gt;will&lt;/em&gt; be returning to enjoying playing VR
again thanks to this little device making it very accessible.&lt;/p&gt;
&lt;div class="footnote"&gt;
&lt;hr /&gt;
&lt;ol&gt;
&lt;li id="fn:429-1"&gt;
&lt;p&gt;I'd place the PSVR2 higher than the Frame if it wasn't for the fact
that I find the grips of the controllers far too bulky and very
difficult to keep gripped for an extended period of time.&amp;#160;&lt;a class="footnote-backref" href="#fnref:429-1" title="Jump back to footnote 1 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:429-2"&gt;
&lt;p&gt;I will be getting prescription inserts when they become available.&amp;#160;&lt;a class="footnote-backref" href="#fnref:429-2" title="Jump back to footnote 2 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:429-3"&gt;
&lt;p&gt;Pity us poor souls who already own it I guess.&amp;#160;&lt;a class="footnote-backref" href="#fnref:429-3" title="Jump back to footnote 3 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</description>
      <guid isPermaLink="false">https://blog.davep.org/2026/09/26/initial-steam-frame-impressions.html</guid>
      <category>Gaming</category>
      <category>PCVR</category>
      <category>Steam</category>
      <category>Steam Frame</category>
      <category>VR</category>
      <category>gaming</category>
      <pubDate>Sat, 26 Sep 2026 11:36:53 +0100</pubDate>
    </item>
    <item>
      <title>Recently I found - 8</title>
      <link>https://blog.davep.org/2026/09/25/recently-i-found-8.html</link>
      <description>&lt;h2 id="introduction"&gt;Introduction&lt;/h2&gt;
&lt;p&gt;An occasional collection of things I've &lt;a href="https://blog.davep.org/series/recently-i-found/"&gt;recently
found&lt;/a&gt; on the Internet and added to &lt;a href="https://blog.davep.org/bookmarks/"&gt;my
bookmarks&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="weird-little-guys-of-foss"&gt;&lt;a href="https://drewdevault.com/weird-guys/" rel="noopener noreferrer" target="_blank"&gt;Weird little guys of FOSS&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;As the name says: a collection of "weird little guys" of the FOSS and
adjacent worlds. Massively subjective, of course, but I don't think I've
seen one (that I know of) that I disagree with yet.&lt;/p&gt;
&lt;h2 id="ball-splitter"&gt;&lt;a href="https://danieljackson-oslo.github.io/balls/" rel="noopener noreferrer" target="_blank"&gt;Ball Splitter&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The sort of thing that's fun to run up, muted, during boring meetings.&lt;/p&gt;
&lt;h2 id="deadpan-photography-enjoying-the-pretence"&gt;&lt;a href="https://photoni.st/index.php/2026/07/12/deadpan-photography-enjoying-the-pretence/" rel="noopener noreferrer" target="_blank"&gt;Deadpan Photography: Enjoying the Pretence&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I love this style of photography, but I don't think I've ever seen an actual
name for the style before. Now I have.&lt;/p&gt;
&lt;h2 id="stargate-worlds-fan-made-private-server"&gt;&lt;a href="https://thefifthrace.online/" rel="noopener noreferrer" target="_blank"&gt;Stargate Worlds — Fan-Made Private Server&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I don't need another game to invest all my time in at the moment. But if I
did, I think it could be this. I love all things Stargate.&lt;/p&gt;
&lt;h2 id="geminispace-topology"&gt;&lt;a href="https://clehaxze.tw/misc/geminispace-topology-2026-09/" rel="noopener noreferrer" target="_blank"&gt;Geminispace topology&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;A map of Geminispace.&lt;/p&gt;
&lt;h2 id="kepler-protocol-specification"&gt;&lt;a href="https://github.com/kevinboone/kepler-protocol" rel="noopener noreferrer" target="_blank"&gt;Kepler protocol specification&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Yet another smolweb protocol, and yet another derived from or related to
Gemini. I doubt I'll do anything with this one (Rogallo supports enough as
it is for now), but it's worth keeping a link to it.&lt;/p&gt;
&lt;h2 id="github-star-history"&gt;&lt;a href="https://star-history.dera.page/" rel="noopener noreferrer" target="_blank"&gt;GitHub star history&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;A GitHub star history that doesn't need access tokens and the like.&lt;/p&gt;
&lt;h2 id="everybodys-lost-their-minds"&gt;&lt;a href="https://www.netmeister.org/blog/everybodys-lost-their-minds.html" rel="noopener noreferrer" target="_blank"&gt;Everybody's Lost Their Minds&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;A pretty great rant about all things AI.&lt;/p&gt;
&lt;h2 id="flet"&gt;&lt;a href="https://flet.dev/" rel="noopener noreferrer" target="_blank"&gt;Flet&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I build enough applications using Textual; it might be interesting to play
with a framework that works on all sorts of platforms (as opposed to just in
the terminal).&lt;/p&gt;
&lt;h2 id="great-on-frame"&gt;&lt;a href="https://store.steampowered.com/greatonframe?curator_clanid=45479024" rel="noopener noreferrer" target="_blank"&gt;Great on Frame&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Games that are verified to work standalone on the &lt;a href="https://blog.davep.org/tag/steam-frame/"&gt;Steam Frame&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="leaving-digitalocean-one-site-at-a-time"&gt;&lt;a href="https://keith.is/post/leaving-digitalocean/" rel="noopener noreferrer" target="_blank"&gt;Leaving DigitalOcean, one site at a time&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I've not used DO for a while now, but I have been thinking about setting up
a small host again so I can play with Gemini and Gopher. Having used DO in
the past, they were at the top of my list.&lt;/p&gt;
&lt;p&gt;Now I'm not so sure I need them there.&lt;/p&gt;
&lt;h2 id="endoflifedate"&gt;&lt;a href="https://endoflife.date/" rel="noopener noreferrer" target="_blank"&gt;endoflife.date&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;End-of-life dates for... so many things!&lt;/p&gt;
&lt;h2 id="team-fortress-2-vr-mod"&gt;&lt;a href="https://store.steampowered.com/app/1055600/Team_Fortress_2_VR_Mod/" rel="noopener noreferrer" target="_blank"&gt;Team Fortress 2: VR Mod&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I used to have so much fun with TF2. The idea of TF2 in VR... hell yes
please!&lt;/p&gt;</description>
      <guid isPermaLink="false">https://blog.davep.org/2026/09/25/recently-i-found-8.html</guid>
      <category>Bookmarks</category>
      <category>Bookmarks</category>
      <category>FOSS</category>
      <category>GitHub</category>
      <category>Python</category>
      <category>Raindrop</category>
      <category>Steam Frame</category>
      <pubDate>Fri, 25 Sep 2026 16:53:50 +0100</pubDate>
    </item>
    <item>
      <title>Siri is broken</title>
      <link>https://blog.davep.org/2026/09/24/siri-is-broken.html</link>
      <description>&lt;p&gt;I think, in part, I regret upgrading any of my &lt;a href="https://blog.davep.org/tag/apple/"&gt;Apple&lt;/a&gt; devices
to the 27 line of operating systems. While my experience as a whole has been
pretty favourable, the one thing I was looking forward to is not just
disappointing, but is a huge step backwards.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Waiting for Siri to do anything" height="914" loading="lazy" src="https://blog.davep.org/attachments/2026/09/24/siri-waiting.webp#centre" width="1206" /&gt;&lt;/p&gt;
&lt;p&gt;I don't use &lt;a href="https://blog.davep.org/tag/siri/"&gt;Siri&lt;/a&gt; for many things, but I do use it a lot for a
small number of core things. On any given day I'll lift my watch up and
speak to it to set a timer or a reminder. Occasionally I'll ask other
things, but they're the main uses. Thanks to the fairly recent addition of
on-device voice handling, these requests have been near-instant.&lt;/p&gt;
&lt;p&gt;With the new Siri that comes with iOS 27, etc., if I'm really lucky the
reply will be super slow (getting on for 20 seconds or so to do the job),
but more often than not it just doesn't work at all. Either it tells me that
my main device isn't available right now&lt;sup id="fnref:427-1"&gt;&lt;a class="footnote-ref" href="#fn:427-1"&gt;1&lt;/a&gt;&lt;/sup&gt; (which I take to mean my
&lt;a href="https://blog.davep.org/tag/iphone/"&gt;iPhone&lt;/a&gt;, which is wild given it's always in my pocket at the
time), or it just busy spins for ages and then simply times out and does
nothing.&lt;/p&gt;
&lt;p&gt;If I try to use Siri on the iPhone itself, it either just busy waits for
ages without getting anything done, or it finally tells me it isn't working.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Siri failing" height="960" loading="lazy" src="https://blog.davep.org/attachments/2026/09/24/siri-failed.webp#centre" width="1206" /&gt;&lt;/p&gt;
&lt;p&gt;I was one of the people who upgraded to the 16 Pro because of the promise of
&lt;em&gt;"Apple Intelligence"&lt;/em&gt;. I was, unsurprisingly, kind of annoyed that they
didn't deliver. But it was fine, the phone is a good one and it's still
serving me well. Also, if I'm honest, I was comfortable with the idea that
they chose to not really implement anything&lt;sup id="fnref:427-2"&gt;&lt;a class="footnote-ref" href="#fn:427-2"&gt;2&lt;/a&gt;&lt;/sup&gt; rather than implement
something bad.&lt;/p&gt;
&lt;p&gt;Sadly though, based on my experience so far, they've implemented something
bad. Since upgrading, on the Watch and iPhone, I've found that it's either
horrifically slow or it just doesn't work. On top of that, I've lost all the
benefit of the on-device voice handling of my watches.&lt;/p&gt;
&lt;div class="footnote"&gt;
&lt;hr /&gt;
&lt;ol&gt;
&lt;li id="fn:427-1"&gt;
&lt;p&gt;Or words to that effect; I can't remember the exact wording.&amp;#160;&lt;a class="footnote-backref" href="#fnref:427-1" title="Jump back to footnote 1 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:427-2"&gt;
&lt;p&gt;I mean, of course, they did do the image playground and writing tools,
but they're hardly the leap forward in assistant intelligence that was
originally being hinted at.&amp;#160;&lt;a class="footnote-backref" href="#fnref:427-2" title="Jump back to footnote 2 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</description>
      <guid isPermaLink="false">https://blog.davep.org/2026/09/24/siri-is-broken.html</guid>
      <category>Tech</category>
      <category>AI</category>
      <category>Apple</category>
      <category>Mac</category>
      <category>Siri</category>
      <category>iPhone</category>
      <category>macOS</category>
      <pubDate>Thu, 24 Sep 2026 08:12:05 +0100</pubDate>
    </item>
    <item>
      <title>Steam Frame is here</title>
      <link>https://blog.davep.org/2026/09/23/steam-frame-is-here.html</link>
      <description>&lt;p&gt;Actually a little sooner than I was expecting -- look what turned up today!&lt;/p&gt;
&lt;p&gt;&lt;img alt="Steam Frame box" height="768" loading="lazy" src="https://blog.davep.org/attachments/2026/09/23/frame-box.webp#centre" width="1024" /&gt;&lt;/p&gt;
&lt;p&gt;When I saw this morning, based on tracking, that it had made it to the
national distribution centre down in England, I was expecting it to head up
this way today and perhaps be out for delivery tomorrow. But, no, a little
later in the morning I got an email to say it was up here and would head out
this afternoon.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Steam Frame box open" height="1365" loading="lazy" src="https://blog.davep.org/attachments/2026/09/23/frame-open.webp#centre" width="1024" /&gt;&lt;/p&gt;
&lt;p&gt;I probably won't be giving it a spin this evening, mainly because I had
plans to &lt;a href="https://www.youtube.com/playlist?list=PLcJDuHvZlXzU" rel="noopener noreferrer" target="_blank"&gt;stream some more
Atomfall&lt;/a&gt; and I'm
actually really into the story right now. The other reason is that I'm still
waiting for the charger and ergonomic pack to show up. Not that I &lt;em&gt;need&lt;/em&gt;
them (it's not like I don't have a charger that'll work), but it would be
nice to have those extra items to hand when I first have a play.&lt;/p&gt;
&lt;p&gt;Realistically, I'm probably not going to get the chance to fire it up until
Friday evening. That's fine, I'm in no rush. I've gone this long without
playing much VR; a couple more evenings won't hurt.&lt;/p&gt;
&lt;p&gt;Meanwhile, I've found out that &lt;a href="https://store.steampowered.com/app/2421750/Gunman_Contracts__Stand_Alone/" rel="noopener noreferrer" target="_blank"&gt;Gunman Contracts - Stand
Alone&lt;/a&gt;
will actually work in standalone mode on the Frame. Yes, I know the name
might suggest that, but the "Stand Alone" in the name is in reference to the
fact that it's &lt;a href="https://steamcommunity.com/sharedfiles/filedetails/?id=2600534901" rel="noopener noreferrer" target="_blank"&gt;no longer an Alyx
mod&lt;/a&gt;.
This makes me quite happy. This is a game I've been looking forward to
playing for a couple of years now and the prospect of being able to dive
into it on the &lt;a href="https://blog.davep.org/tag/steam-frame/"&gt;Steam Frame&lt;/a&gt;, without needing to faff
with my PC, very much appeals.&lt;/p&gt;
&lt;p&gt;I'll be sure to jot down some impressions once I've had a proper session.&lt;/p&gt;</description>
      <guid isPermaLink="false">https://blog.davep.org/2026/09/23/steam-frame-is-here.html</guid>
      <category>Gaming</category>
      <category>PCVR</category>
      <category>Steam</category>
      <category>Steam Frame</category>
      <category>VR</category>
      <category>gaming</category>
      <pubDate>Wed, 23 Sep 2026 17:14:29 +0100</pubDate>
    </item>
    <item>
      <title>GopherMap v1.1.0</title>
      <link>https://blog.davep.org/2026/09/22/gophermap-v1-1-0.html</link>
      <description>&lt;p&gt;I've just made a small update to &lt;a href="https://gophermap.davep.dev/" rel="noopener noreferrer" target="_blank"&gt;GopherMap&lt;/a&gt;.
While doing some work on &lt;a href="https://rogallo.davep.dev/" rel="noopener noreferrer" target="_blank"&gt;Rogallo&lt;/a&gt; I noticed
that, somehow, I wasn't showing a type "badge" for PNG files (&lt;code&gt;p&lt;/code&gt;). I spent
a moment or two trying to figure out what was wrong with the code in
Rogallo, and then realised that I'd managed to miss out both PNG and RTF
files in GopherMap itself.&lt;/p&gt;
&lt;p&gt;So this release adds those types.&lt;/p&gt;
&lt;p&gt;At this point I believe that GopherMap now knows about &lt;a href="https://en.wikipedia.org/wiki/Gopher_(protocol)#Item_types" rel="noopener noreferrer" target="_blank"&gt;all the canonical
and most useful non-canonical
types&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;At some point I should probably look at
&lt;a href="https://en.wikipedia.org/wiki/Gopher_(protocol)#Gopher+" rel="noopener noreferrer" target="_blank"&gt;Gopher+&lt;/a&gt;, which I
suspect will also mean some changes to &lt;a href="https://port70.davep.dev/" rel="noopener noreferrer" target="_blank"&gt;Port70&lt;/a&gt;.&lt;/p&gt;</description>
      <guid isPermaLink="false">https://blog.davep.org/2026/09/22/gophermap-v1-1-0.html</guid>
      <category>Python</category>
      <category>Coding</category>
      <category>PyPI</category>
      <category>Python</category>
      <category>gopher</category>
      <category>smolweb</category>
      <pubDate>Tue, 22 Sep 2026 08:12:12 +0100</pubDate>
    </item>
    <item>
      <title>Steam Frame is shipped</title>
      <link>https://blog.davep.org/2026/09/21/steam-frame-is-shipped.html</link>
      <description>&lt;p&gt;I sat down at my desk at about 08:40 this morning and, five minutes later,
got an email from Valve to say they were preparing my Steam Frame for
shipping! On visiting the site, it said it was shipped.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Steam Frame shipped" height="181" loading="lazy" src="https://blog.davep.org/attachments/2026/09/21/frame-shipped.webp#centre" width="277" /&gt;&lt;/p&gt;
&lt;p&gt;Checking with the carrier, there's the usual message to say they're aware of
the package but haven't picked it up yet. At this rate, it does look like
I'll have my hands on it this week.&lt;/p&gt;
&lt;p&gt;Time to have a proper look into what games and apps will run standalone on
it. The &lt;a href="https://steamcommunity.com/games/546560/announcements/detail/679635225181947034?snr=2___" rel="noopener noreferrer" target="_blank"&gt;updated
Alyx&lt;/a&gt;
I know about (which does have me wondering if the workshop items will work
-- &lt;a href="https://steamcommunity.com/sharedfiles/filedetails/?id=2600534901" rel="noopener noreferrer" target="_blank"&gt;the original Gunman
Contracts&lt;/a&gt;
should be fun), but I've not really checked yet what other actual VR titles
will run without the need for a PC.&lt;/p&gt;</description>
      <guid isPermaLink="false">https://blog.davep.org/2026/09/21/steam-frame-is-shipped.html</guid>
      <category>Gaming</category>
      <category>PCVR</category>
      <category>Steam</category>
      <category>Steam Frame</category>
      <category>VR</category>
      <category>gaming</category>
      <pubDate>Mon, 21 Sep 2026 10:09:21 +0100</pubDate>
    </item>
    <item>
      <title>Steam Frame is packaged</title>
      <link>https://blog.davep.org/2026/09/20/steam-frame-is-packaged.html</link>
      <description>&lt;p&gt;It looks like things are moving a wee bit quicker than I remember when I
&lt;a href="https://blog.davep.org/series/buying-the-steam-controller/"&gt;bought the Steam Controller&lt;/a&gt;, with
the status of my &lt;a href="https://blog.davep.org/tag/steam-frame/"&gt;Steam Frame&lt;/a&gt; purchase moving to
"packaged" pretty quickly.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Steam Frame packaged" height="350" loading="lazy" src="https://blog.davep.org/attachments/2026/09/20/steam-frame-packaged.webp#centre" width="548" /&gt;&lt;/p&gt;
&lt;p&gt;I'm curious as to when it will arrive. The small number of times that I've
purchased Valve hardware, I've generally found the actual shipping (once
it's shipped) to be reasonably swift.&lt;/p&gt;
&lt;p&gt;I could be in the position of being able to play with my new headset before
next weekend. While I'm most interested in the standalone experience, I
&lt;em&gt;might&lt;/em&gt; have to dig out the &lt;a href="https://blog.davep.org/2022/05/28/my-vr-recording-setup.html"&gt;VR gaming
PC&lt;/a&gt;, update a bunch of things on it,
and give it a general tidy. It's getting on a bit now, but it will be
interesting to test out the wireless PCVR mode.&lt;/p&gt;</description>
      <guid isPermaLink="false">https://blog.davep.org/2026/09/20/steam-frame-is-packaged.html</guid>
      <category>Gaming</category>
      <category>PCVR</category>
      <category>Steam</category>
      <category>Steam Frame</category>
      <category>VR</category>
      <category>gaming</category>
      <pubDate>Sun, 20 Sep 2026 08:52:44 +0100</pubDate>
    </item>
    <item>
      <title>Steam Frame purchased</title>
      <link>https://blog.davep.org/2026/09/19/steam-frame-purchased.html</link>
      <description>&lt;p&gt;I didn't have to spend too long in the &lt;a href="https://blog.davep.org/tag/steam-frame/"&gt;Steam Frame&lt;/a&gt;
&lt;a href="https://blog.davep.org/2026/09/18/in-the-steam-frame-queue.html"&gt;reservation queue&lt;/a&gt;. I'd just sat
down on the sofa, after having dinner yesterday evening, opened the MacBook
to hack on some code, and had this turn up:&lt;/p&gt;
&lt;p&gt;&lt;img alt="Purchase confirmation email" height="114" loading="lazy" src="https://blog.davep.org/attachments/2026/09/19/purchase-confirmation.webp#centre" width="1582" /&gt;&lt;/p&gt;
&lt;p&gt;I didn't hesitate. However, during the checkout journey, there was a glitch.
I opened the email, clicked on the link to go and confirm the purchase, and
on the &lt;a href="https://blog.davep.org/tag/steam/"&gt;Steam&lt;/a&gt; site I was greeted with a message to the effect
that the quantity I was buying was too great! It wouldn't let me proceed to
the payment. I clicked on the button to view my basket and this is what I
saw:&lt;/p&gt;
&lt;p&gt;&lt;img alt="Two Frames for the price of two" height="1164" loading="lazy" src="https://blog.davep.org/attachments/2026/09/19/two-frames-for-the-price-of-two.webp#centre" width="1662" /&gt;&lt;/p&gt;
&lt;p&gt;This did make me slightly nervous for a moment. It was an obvious glitch,
but was it double-counting the same unit, or had it somehow added two units
to my basket? Given that I couldn't progress without doing something, I
removed one and... it was all okay.&lt;/p&gt;
&lt;p&gt;So as of right now I'm paid up, I have an active order, and now I wait for
physical delivery. The estimated delivery time seems to be between 3 and 5
(working?) days.&lt;/p&gt;
&lt;p&gt;Meanwhile, I now need to figure out what to do about prescription lens
inserts. The inserts that Valve recommend on &lt;a href="https://store.steampowered.com/hardware/steamframe" rel="noopener noreferrer" target="_blank"&gt;the Steam Frame
page&lt;/a&gt; &lt;a href="https://www.zennioptical.com/steamframe-vr-prescription-insert" rel="noopener noreferrer" target="_blank"&gt;are currently
"coming
soon"&lt;/a&gt;,
which is mildly annoying. I have noticed in the &lt;a href="https://www.reddit.com/r/SteamFrame/" rel="noopener noreferrer" target="_blank"&gt;Steam Frame
subreddit&lt;/a&gt; a couple of people
mentioning other companies who are already manufacturing and shipping
inserts. I might take a look at them.&lt;/p&gt;
&lt;p&gt;The need for prescription lenses is one annoyance of &lt;a href="https://blog.davep.org/tag/vr/"&gt;VR&lt;/a&gt; for me.
Sure, it's easily fixed, but it's a bit of a shame when, upon opening the
box, I have to go with a blurry experience for a wee while. Of course, I
&lt;em&gt;could&lt;/em&gt; wear my glasses in the headset, but based on my experience when I
got my Quest 2 back in late 2020, that's not comfortable &lt;em&gt;and&lt;/em&gt; there's the
danger of scratching the glasses, headset lenses, or both.&lt;/p&gt;
&lt;p&gt;It's not worth the risk.&lt;/p&gt;</description>
      <guid isPermaLink="false">https://blog.davep.org/2026/09/19/steam-frame-purchased.html</guid>
      <category>Gaming</category>
      <category>PCVR</category>
      <category>Steam</category>
      <category>Steam Frame</category>
      <category>VR</category>
      <category>gaming</category>
      <pubDate>Sat, 19 Sep 2026 10:16:49 +0100</pubDate>
    </item>
    <item>
      <title>In the Steam Frame queue</title>
      <link>https://blog.davep.org/2026/09/18/in-the-steam-frame-queue.html</link>
      <description>&lt;p&gt;It's getting on for six years now since I got my first VR headset, and it's
the best part of five years since I sorted myself with a &lt;a href="https://blog.davep.org/tag/pcvr/"&gt;PCVR&lt;/a&gt;
setup. Between then and now I've &lt;a href="https://www.youtube.com/playlist?list=PLUY2FpMDyORCk74IQ3sfWsxg242qLwQ8g" rel="noopener noreferrer" target="_blank"&gt;played a &lt;em&gt;lot&lt;/em&gt; of VR games and spent a lot
of time in
VR&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;This last year, though, aside from a quick dabble with the PS5 version of
Zero Caliber, I've not really been in VR. Mostly this is down to me moving
late on last year, and evenings and weekends now being busier with other
things. It's sort of always felt like a hassle to have to set up the PCVR
rig (when you live alone it's fine to have your PCVR rig lying around the
living room all the time; when you share with other people and your cat...
not so much).&lt;/p&gt;
&lt;p&gt;So when I saw the Steam Frame announced and realised that it would likely
give me standalone access to some PCVR-level games (yes, I know, not really
PCVR, but I would hope that there will be a push to get many games running
standalone), I was tempted. Very tempted. Not only does it offer a
good-quality standalone headset, it's also still designed as a full PCVR
headset. Feels win/win.&lt;/p&gt;
&lt;p&gt;Fast forward to yesterday evening...&lt;/p&gt;
&lt;p&gt;&lt;img alt="I'm on the reservation list" height="287" loading="lazy" src="https://blog.davep.org/attachments/2026/09/18/frame-list.webp#centre" width="603" /&gt;&lt;/p&gt;
&lt;p&gt;I don't know that I'll return to recording PCVR quite yet -- I guess that'll
depend on what the Frame offers in terms of being able to record -- but I
aim to dive back into any parts of my catalogue that will work with the
device. I think &lt;a href="https://store.steampowered.com/news/app/546560/view/679635225181947033?l=english" rel="noopener noreferrer" target="_blank"&gt;a full revisit to the world of Half-Life is
necessary&lt;/a&gt;
if nothing else.&lt;/p&gt;</description>
      <guid isPermaLink="false">https://blog.davep.org/2026/09/18/in-the-steam-frame-queue.html</guid>
      <category>Gaming</category>
      <category>PCVR</category>
      <category>Steam</category>
      <category>Steam Frame</category>
      <category>VR</category>
      <category>gaming</category>
      <pubDate>Fri, 18 Sep 2026 08:54:45 +0100</pubDate>
    </item>
    <item>
      <title>GitHub PR reviews broken</title>
      <link>https://blog.davep.org/2026/09/13/github-pr-reviews-broken.html</link>
      <description>&lt;p&gt;Late on last week I was doing a PR review at work and noticed that, for some
odd reason, the author of the PR seemed to have absolutely nuked all of the
indentation in the code. While not a problem given the nature of the files I
was reviewing, I wasn't happy with their apparent disregard for style and
good practice, and was about to leave a remark and a request for changes.
But something seemed off. So I did a refresh of the page and... everything
fell into place.&lt;/p&gt;
&lt;p&gt;Weird.&lt;/p&gt;
&lt;p&gt;Since then I've seen the issue on multiple machines. To be fair, each time
it's been in Safari, and each time I've been busy with something else so
haven't had the chance to really dive into it. But given it's suddenly
cropped up, at the same time, on multiple machines, with nothing else
changing, it feels like something on the GitHub side of things.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Broken code review" height="2056" loading="lazy" src="https://blog.davep.org/attachments/2026/09/13/borked-code-review.webp#centre" width="2600" /&gt;&lt;/p&gt;
&lt;p&gt;Perhaps I'm letting a bit of bias creep in here, but I feel like this sort
of thing is happening more and more on GitHub. It's not that long back since
&lt;a href="https://blog.davep.org/2026/08/21/github-social-preview-is-broken.html"&gt;social previews suddenly
broke&lt;/a&gt;, for example. It's
hard to shake the idea that changes are being made without regard to
comprehensive testing, and likely without regard to how things connect.&lt;/p&gt;
&lt;p&gt;Now, at this point, it would be easy to reach for the &lt;em&gt;"well they're
obviously using agents to do most of the work"&lt;/em&gt; argument -- and I'm sure
plenty of people would -- but that doesn't quite fit with my experience.
Having experimented with such tools for a good chunk of this year now, both
for personal and, more recently, professional projects, I've generally found
that such tooling easily helps with catching such issues.&lt;/p&gt;
&lt;p&gt;Plenty of times now, when using something like
&lt;a href="https://blog.davep.org/tag/antigravity/"&gt;Antigravity&lt;/a&gt; or Claude Code to work on some code, I've
found that with reasonable care (you know: the sort of care you'd put into
your work anyway) you can quickly and easily uncover connections and
knock-on effects you might not have immediately noticed. Moreover, if LLMs
are useful for anything when it comes to coding, it's for writing tests&lt;sup id="fnref:419-1"&gt;&lt;a class="footnote-ref" href="#fn:419-1"&gt;1&lt;/a&gt;&lt;/sup&gt;.
With that in mind you should be able to reasonably expect the number of
silly bugs to go down.&lt;/p&gt;
&lt;p&gt;Unless, of course, there's no human in the loop anywhere, or the human in
the loop lacks adequate training and experience, or, I guess, they simply
lack the ability to give a shit.&lt;/p&gt;
&lt;p&gt;I wonder when this particular issue will get fixed? I should probably go and
see if it's reported in the GitHub forums anywhere. I know for sure that
there's little point in actually reporting it as a bug; my experiences with
that in the past haven't been great, and the GitHub subreddit has seen
enough stories of people getting nowhere.&lt;/p&gt;
&lt;div class="footnote"&gt;
&lt;hr /&gt;
&lt;ol&gt;
&lt;li id="fn:419-1"&gt;
&lt;p&gt;Arguably they're a little too good at it to the point of coming round
the other side and doing badly again, if you don't keep an eye on things.&amp;#160;&lt;a class="footnote-backref" href="#fnref:419-1" title="Jump back to footnote 1 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</description>
      <guid isPermaLink="false">https://blog.davep.org/2026/09/13/github-pr-reviews-broken.html</guid>
      <category>Tech</category>
      <category>GitHub</category>
      <category>web</category>
      <pubDate>Sun, 13 Sep 2026 15:19:16 +0100</pubDate>
    </item>
    <item>
      <title>Rogallo v2.4.0</title>
      <link>https://blog.davep.org/2026/09/09/rogallo-v2-4-0.html</link>
      <description>&lt;p&gt;I've released &lt;a href="https://rogallo.davep.dev/" rel="noopener noreferrer" target="_blank"&gt;Rogallo&lt;/a&gt;
&lt;a href="https://rogallo.davep.dev/changelog/#v240" rel="noopener noreferrer" target="_blank"&gt;v2.4.0&lt;/a&gt;, which contains two new
features.&lt;/p&gt;
&lt;p&gt;The first is the addition of a feature related to the &lt;a href="https://blog.davep.org/tag/gemini-protocol/"&gt;Gemini
Protocol&lt;/a&gt;, and it's something I've been meaning to
add for a wee while: a trusted host browser/manager. It's a simple enough
idea: you might want to have a look at all the host/port pairs that exist in
your trusted hosts list and, perhaps, revoke the trust for one or more.&lt;/p&gt;
&lt;p&gt;&lt;img alt="The trusted host browser" height="948" loading="lazy" src="https://blog.davep.org/attachments/2026/09/09/trusted-host-browser.webp#centre" width="1020" /&gt;&lt;/p&gt;
&lt;p&gt;From the dialog you can either visit the host/port combination (perhaps you
got curious about what you've trusted in the past and want to see what was
there), or you can forget the trust. This also somewhat follows on from work
done in &lt;a href="https://blog.davep.org/2026/08/31/rogallo-v2-1-0.html"&gt;Rogallo v2.1.0&lt;/a&gt;, except rather
than having to make the decision when you visit a capsule, you can review
all the capsules you currently trust.&lt;/p&gt;
&lt;p&gt;If this seems useful, it's called up with the new &lt;code&gt;BrowseTrustedHosts&lt;/code&gt;
command, bound to &lt;kbd&gt;Ctrl&lt;/kbd&gt;+&lt;kbd&gt;Shift&lt;/kbd&gt;+&lt;kbd&gt;t&lt;/kbd&gt; by default.&lt;/p&gt;
&lt;p&gt;The second new feature is something that's been on my TODO list for quite a
while, and has mainly been sat there because I wanted the viewer widget in
the application to settle down a bit before I tackled this. I'm talking here
about in-viewer search. It's a simple enough requirement, but one that's not
&lt;em&gt;that&lt;/em&gt; straightforward when you're dealing with views of different kinds of
text files, views of the source of such documents, and also having to handle
things like embedded ANSI escape sequences.&lt;/p&gt;
&lt;p&gt;The work is now done, so if the viewer itself is focused, you can press
&lt;kbd&gt;Ctrl&lt;/kbd&gt;+&lt;kbd&gt;f&lt;/kbd&gt;, enter some text to search for, and then press
&lt;kbd&gt;Ctrl&lt;/kbd&gt;+&lt;kbd&gt;n&lt;/kbd&gt; to keep moving through all the hits. Once you
hit the last match, you'll be told there are no more matches, but then the
search will start again from the top.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Performing a text search" loading="lazy" src="https://blog.davep.org/attachments/2026/09/09/text-search.gif#centre" /&gt;&lt;/p&gt;
&lt;p&gt;You can also cancel an ongoing search with
&lt;kbd&gt;Ctrl&lt;/kbd&gt;+&lt;kbd&gt;Shift&lt;/kbd&gt;+&lt;kbd&gt;f&lt;/kbd&gt;.&lt;/p&gt;
&lt;p&gt;I'm glad to finally get this added to Rogallo as it's a feature I've been
finding myself needing on a good few occasions.&lt;/p&gt;</description>
      <guid isPermaLink="false">https://blog.davep.org/2026/09/09/rogallo-v2-4-0.html</guid>
      <category>Coding</category>
      <category>Coding</category>
      <category>Gemini Protocol</category>
      <category>PyPI</category>
      <category>Python</category>
      <category>Rogallo</category>
      <category>smolweb</category>
      <pubDate>Wed, 09 Sep 2026 08:37:57 +0100</pubDate>
    </item>
    <item>
      <title>Rogallo v2.3.0</title>
      <link>https://blog.davep.org/2026/09/06/rogallo-v2-3-0.html</link>
      <description>&lt;p&gt;&lt;a href="https://rogallo.davep.dev/" rel="noopener noreferrer" target="_blank"&gt;Rogallo&lt;/a&gt;
&lt;a href="https://rogallo.davep.dev/changelog/#v230" rel="noopener noreferrer" target="_blank"&gt;v2.3.0&lt;/a&gt; is now available. The
main addition to this release is support for the &lt;a href="https://rogallo.davep.dev/titan/" rel="noopener noreferrer" target="_blank"&gt;Titan
Protocol&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;First up, there's a small fix. The other day I discovered
&lt;a href="gemini://ultimatumlabs.com/scripto.gmi" rel="noopener noreferrer" target="_blank"&gt;Scriptonite&lt;/a&gt;. While looking at the
examples I noticed none of them worked with Rogallo. This struck me as odd
because the whole point of Scriptonite is that it all happens on the
server-side; nothing on the client-side should affect how well it works.&lt;/p&gt;
&lt;p&gt;It turns out that &lt;a href="https://wasat.davep.dev/" rel="noopener noreferrer" target="_blank"&gt;Wasat&lt;/a&gt; had a bug when it came
to slicing and dicing Gemini URIs, where parts of a URI that followed a &lt;code&gt;;&lt;/code&gt;
were being lost. Somewhat amusingly, I didn't even need to do any work on a
fix because it had already been taken care of in the branch that existed to
support Titan.&lt;/p&gt;
&lt;p&gt;The point here being: as of v2.3.0, Rogallo now works fine with the
Scriptonite examples.&lt;/p&gt;
&lt;p&gt;As I mentioned, the &lt;em&gt;main&lt;/em&gt; change in this release is support for the Titan
protocol. It's been on the TODO list for a wee while, partly because I was
struggling to follow the idea of it, and also partly because I'd not played
with it and just didn't see the purpose. The other day I sat down and
properly dived in and it finally all clicked.&lt;/p&gt;
&lt;p&gt;With v2.3.0, if you now visit a &lt;code&gt;titan://&lt;/code&gt; URI, you will be presented with a
rich input dialog. It is a tabbed view, with one tab being for text
input/upload:&lt;/p&gt;
&lt;p&gt;&lt;img alt="Titan text entry" height="1856" loading="lazy" src="https://blog.davep.org/attachments/2026/09/06/titan-text.webp#centre" width="1942" /&gt;&lt;/p&gt;
&lt;p&gt;and the other being a file attachment and upload:&lt;/p&gt;
&lt;p&gt;&lt;img alt="Titan file upload" height="1856" loading="lazy" src="https://blog.davep.org/attachments/2026/09/06/titan-file.webp#centre" width="1942" /&gt;&lt;/p&gt;
&lt;p&gt;As per the Titan specification, there is support for setting the MIME type
for the attached data. If using the text view, this will always be set to
&lt;code&gt;text/plain&lt;/code&gt;. If using a file attach/upload, you have full control over it,
but it will default to the best guess based on the file selected.&lt;/p&gt;
&lt;p&gt;There is also support for entering an upload token.&lt;/p&gt;
&lt;p&gt;As well as supporting the core Titan specification, I've also added support
for &lt;a href="gemini://transjovian.org/titan/Edit%20Link" rel="noopener noreferrer" target="_blank"&gt;the proposed &lt;code&gt;;edit&lt;/code&gt;
extension&lt;/a&gt;. This means that it
is safe to enable Titan-based editing on
&lt;a href="gemini://bbs.geminispace.org/" rel="noopener noreferrer" target="_blank"&gt;bbs.geminispace.org&lt;/a&gt;, making it easier to
modify text you've already written.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Editing a post with Titan" height="2048" loading="lazy" src="https://blog.davep.org/attachments/2026/09/06/titan-edit.webp#centre" width="2598" /&gt;&lt;/p&gt;
&lt;p&gt;One final change in this release of Rogallo also relates to user input. I've
given the Gemini-based input dialog an overhaul. Originally this was, by
design, as simple and as bare-bones as possible. It was simply a free-text
input box that would grow as you added lines, and the prompt from the server
was shown as a title in the border of that box. While testing out editing on
BBS, I realised that this doesn't always work so well; most of the time the
prompt would get truncated.&lt;/p&gt;
&lt;p&gt;&lt;img alt="The input prompt being truncated" height="232" loading="lazy" src="https://blog.davep.org/attachments/2026/09/06/old-input.webp#centre" width="1592" /&gt;&lt;/p&gt;
&lt;p&gt;Not a great user experience. The redesigned input box works more or less the
same, but now ensures that the prompt is fully visible.&lt;/p&gt;
&lt;p&gt;&lt;img alt="The new version of the input box" height="358" loading="lazy" src="https://blog.davep.org/attachments/2026/09/06/new-input.webp#centre" width="1048" /&gt;&lt;/p&gt;
&lt;p&gt;Between this change and the new Titan edit/upload dialog, I feel Rogallo is
now in a good position to act as a near-zero-compromise daily driver when
it comes to wandering around the small web.&lt;/p&gt;
&lt;p&gt;I guess adding tabs will get it closer to zero. Perhaps in-terminal image
viewing. Okay, perhaps a sprinkle of http(s) support too? Also...&lt;/p&gt;</description>
      <guid isPermaLink="false">https://blog.davep.org/2026/09/06/rogallo-v2-3-0.html</guid>
      <category>Coding</category>
      <category>Coding</category>
      <category>Gemini Protocol</category>
      <category>PyPI</category>
      <category>Python</category>
      <category>Rogallo</category>
      <category>Titan Protocol</category>
      <category>smolweb</category>
      <pubDate>Sun, 06 Sep 2026 10:41:12 +0100</pubDate>
    </item>
    <item>
      <title>Wasat v1.9.0</title>
      <link>https://blog.davep.org/2026/09/05/wasat-v1-9-0.html</link>
      <description>&lt;p&gt;The &lt;a href="https://github.com/davep/rogallo/pull/417" rel="noopener noreferrer" target="_blank"&gt;work to add Titan support to
Rogallo&lt;/a&gt; is going well, and I've
been able to test it out fine on &lt;a href="gemini://bbs.geminispace.org/" rel="noopener noreferrer" target="_blank"&gt;bbs&lt;/a&gt;, doing
additions of "long text" and performing file uploads. In doing so, though, I
was reminded that there is &lt;a href="gemini://transjovian.org/titan/Edit%20Link" rel="noopener noreferrer" target="_blank"&gt;a proposed "edit" extension to
Titan&lt;/a&gt;, which is supported there
(and I believe on a couple of other capsules too). That got me thinking...&lt;/p&gt;
&lt;p&gt;&lt;a href="https://wasat.davep.dev/" rel="noopener noreferrer" target="_blank"&gt;Wasat&lt;/a&gt;
&lt;a href="https://wasat.davep.dev/changelog/#v190" rel="noopener noreferrer" target="_blank"&gt;v1.9.0&lt;/a&gt; is now available, which
adds support for this extension. Of most use is the
&lt;a href="https://wasat.davep.dev/library/uri/#wasat.uri.TitanURI.is_edit" rel="noopener noreferrer" target="_blank"&gt;&lt;code&gt;is_edit&lt;/code&gt;&lt;/a&gt;
property which has been added to &lt;code&gt;TitanURI&lt;/code&gt;, giving a well-defined approach
to testing whether a Titan URI is for editing a resource. The &lt;code&gt;Client&lt;/code&gt; class
has also grown an
&lt;a href="https://wasat.davep.dev/library/client/#wasat.client.Client.edit" rel="noopener noreferrer" target="_blank"&gt;&lt;code&gt;edit&lt;/code&gt;&lt;/a&gt;
method to handle the request for the raw content which will then be used as
the basis for a subsequent edit by the user, before being uploaded.&lt;/p&gt;
&lt;p&gt;All of this, of course, pushes back the work I'm doing on Rogallo, just a
little. As I said above, the Titan support is pretty much there and working,
but now I want to try and really dial it in and get it working "just so".
While the &lt;code&gt;edit&lt;/code&gt; support is probably pretty niche, it seems worth adding
and, I hope, might delight someone one day when they try it out and it "just
works".&lt;/p&gt;</description>
      <guid isPermaLink="false">https://blog.davep.org/2026/09/05/wasat-v1-9-0.html</guid>
      <category>Python</category>
      <category>Coding</category>
      <category>Gemini Protocol</category>
      <category>PyPI</category>
      <category>Python</category>
      <category>smolweb</category>
      <category>wasat</category>
      <pubDate>Sat, 05 Sep 2026 08:20:48 +0100</pubDate>
    </item>
    <item>
      <title>Wasat v1.8.0</title>
      <link>https://blog.davep.org/2026/09/03/wasat-v1-8-0.html</link>
      <description>&lt;p&gt;Another quick little update to &lt;a href="https://wasat.davep.dev/" rel="noopener noreferrer" target="_blank"&gt;Wasat&lt;/a&gt;, bumping
the version to &lt;a href="https://wasat.davep.dev/changelog/#v180" rel="noopener noreferrer" target="_blank"&gt;v1.8.0&lt;/a&gt;. This
version is in support of some work I'm about to do on
&lt;a href="https://rogallo.davep.dev/" rel="noopener noreferrer" target="_blank"&gt;Rogallo&lt;/a&gt;: Titan support.&lt;/p&gt;
&lt;p&gt;This release adds &lt;code&gt;TitanURI&lt;/code&gt; and makes a number of changes to handle such
URIs alongside &lt;code&gt;GeminiURI&lt;/code&gt;. A lucky side-effect is that a problem was
uncovered and corrected with how Gemini URIs are sliced and diced in the
library. This first showed up for me when &lt;a href="https://github.com/davep/rogallo/issues/407" rel="noopener noreferrer" target="_blank"&gt;I was having a look at the
Scriptonite examples&lt;/a&gt;. None of
them were working for no obvious reason. Eventually it became clear that
parts of the URIs were being lost as they travelled through Wasat's code.&lt;/p&gt;
&lt;p&gt;So v1.8.0 clears up that problem (fixing the bug in Rogallo by simply
upgrading the library).&lt;/p&gt;
&lt;p&gt;As of now, I can move on to &lt;a href="https://github.com/davep/rogallo/issues/355" rel="noopener noreferrer" target="_blank"&gt;actually adding Titan
support&lt;/a&gt;.&lt;/p&gt;</description>
      <guid isPermaLink="false">https://blog.davep.org/2026/09/03/wasat-v1-8-0.html</guid>
      <category>Python</category>
      <category>Coding</category>
      <category>Gemini Protocol</category>
      <category>PyPI</category>
      <category>Python</category>
      <category>smolweb</category>
      <category>wasat</category>
      <pubDate>Thu, 03 Sep 2026 19:24:30 +0100</pubDate>
    </item>
    <item>
      <title>next-gh-pr.el v1.1.0</title>
      <link>https://blog.davep.org/2026/09/03/next-gh-pr-el-v1-1-0.html</link>
      <description>&lt;p&gt;A quick little update to
&lt;a href="https://github.com/davep/next-gh-pr.el" rel="noopener noreferrer" target="_blank"&gt;&lt;code&gt;next-gh-pr.el&lt;/code&gt;&lt;/a&gt;. Since &lt;a href="https://blog.davep.org/2026/05/19/next-gh-pr-el-v1-0-0.html"&gt;writing
the first version&lt;/a&gt; I've found it to
be really useful, but I've also bumped into one small issue. Sometimes I'll
create a draft PR before I remember to start the changelog entry, and so
then I want to insert the &lt;em&gt;current&lt;/em&gt; PR link rather than the next one.&lt;/p&gt;
&lt;p&gt;Now, sure, I can just go and copy the URL and create the link in the
changelog, but where's the fun in that when I can solve the problem in
&lt;a href="https://blog.davep.org/tag/emacs-lisp/"&gt;Emacs Lisp&lt;/a&gt;? So, with this in mind, I've just updated the
package so that, with a prefix argument to the command, it will include a
link for the latest PR rather than for the next one.&lt;/p&gt;
&lt;p&gt;This does, of course, make the name a little less correct, but I'm not going
to rename the package or the command for this one minor difference in
intent.&lt;/p&gt;</description>
      <guid isPermaLink="false">https://blog.davep.org/2026/09/03/next-gh-pr-el-v1-1-0.html</guid>
      <category>Emacs</category>
      <category>Emacs</category>
      <category>Emacs Lisp</category>
      <category>GitHub</category>
      <category>Lisp</category>
      <category>coding</category>
      <category>git</category>
      <category>next-gh-pr.el</category>
      <pubDate>Thu, 03 Sep 2026 15:17:17 +0100</pubDate>
    </item>
    <item>
      <title>Rogallo v2.2.0</title>
      <link>https://blog.davep.org/2026/09/03/rogallo-v2-2-0.html</link>
      <description>&lt;p&gt;&lt;a href="https://rogallo.davep.dev/" rel="noopener noreferrer" target="_blank"&gt;Rogallo&lt;/a&gt;
&lt;a href="https://rogallo.davep.dev/changelog/#v220" rel="noopener noreferrer" target="_blank"&gt;v2.2.0&lt;/a&gt; is available. This
release contains a handful of small new features and also a very minor
cosmetic change.&lt;/p&gt;
&lt;p&gt;First to the small cosmetic change: the overall design behind the UI of
Rogallo is that it's split into a couple of key panels -- the side-panel and
the main viewer. The styling of a panel when focus is within it, and when it
is outwith it, is different; the idea being that your eye should be drawn to
the active panel. This is an approach I take with all my
&lt;a href="https://blog.davep.org/tag/textual/"&gt;Textual&lt;/a&gt; applications.&lt;/p&gt;
&lt;p&gt;Part of this styling is to have a thin border to the left of the active
panel, which also helps signify that the panel is the one you should be
paying attention to. In applications where there's always two or more panels
on the screen all the time, this makes sense -- you want the line between
the panels anyway to help break up the content. In Rogallo, however, it's
going to be normal to only ever have the one panel in view (the viewer).&lt;/p&gt;
&lt;p&gt;The other day I realised that, when it's just the viewer available, I should
remove that left-hand border. So that's how Rogallo works now. If the viewer
is the only panel visible: no border. If the side-panel is also visible:
borders. I think it makes the display look a little cleaner; for what it's
worth it also saves one column of the display for something more useful.&lt;/p&gt;
&lt;p&gt;I've also added a couple of useful features to the active link in the
viewer. Now, when a link is selected, you can press &lt;kbd&gt;c&lt;/kbd&gt; to copy the
URI of that link to the clipboard. You can also press &lt;kbd&gt;o&lt;/kbd&gt; to open
the URI by passing it to the operating system. Both these changes should
make it easier to take a link out of a document and go and do something else
with it.&lt;/p&gt;
&lt;p&gt;The last couple of changes are around visiting &lt;code&gt;finger://&lt;/code&gt; URIs. The first
is a quick and simple change: any finger content now makes use of Rogallo's
document cache, so if you find yourself navigating back and forth between
finger responses, there should be fewer requests made in a short period of
time.&lt;/p&gt;
&lt;p&gt;I added caching partly in anticipation of another change to finger
responses: making them interactive where possible. Having created
&lt;a href="https://blog.davep.org/2026/09/02/finger2gemtext-a-library-for-converting-finger-responses-to-gemtext.html"&gt;&lt;code&gt;finger2gemtext&lt;/code&gt;&lt;/a&gt;,
I've updated Rogallo so that, where possible, the response is turned into
&lt;a href="https://blog.davep.org/tag/gemtext/"&gt;Gemtext&lt;/a&gt; and anything that can be turned into a link is now
interactive. This means that some finger services should be easier to
navigate, no longer requiring that you copy/edit/paste text to get a fresh
&lt;code&gt;finger://&lt;/code&gt; URI to follow.&lt;/p&gt;
&lt;p&gt;This can be seen if you visit somewhere like
&lt;a href="finger://plan.cat" rel="noopener noreferrer" target="_blank"&gt;&lt;code&gt;finger://plan.cat&lt;/code&gt;&lt;/a&gt; or
&lt;a href="finger://redterminal.org/" rel="noopener noreferrer" target="_blank"&gt;&lt;code&gt;finger://redterminal.org/&lt;/code&gt;&lt;/a&gt;. Whereas before you
would just be shown some plain text:&lt;/p&gt;
&lt;p&gt;&lt;img alt="A plain text finger response" height="820" loading="lazy" src="https://blog.davep.org/attachments/2026/09/03/finger-plain.webp#centre" width="780" /&gt;&lt;/p&gt;
&lt;p&gt;Now you get a version that lets you follow the implied links in the
response:&lt;/p&gt;
&lt;p&gt;&lt;img alt="A richer finger response" height="820" loading="lazy" src="https://blog.davep.org/attachments/2026/09/03/finger-rich.webp#centre" width="780" /&gt;&lt;/p&gt;
&lt;p&gt;This is, of course, going to be reasonably brittle. If any of the services
change their output format such that the "links" can't be detected any more,
the output won't be turned into Gemtext. Likewise, it's not impossible that
false positives might turn up. I'm going to run with this for a while and
see how it works out. I also have a vague plan for how the detection and
smarter rendering of finger responses could be made configurable by the
user.&lt;/p&gt;
&lt;p&gt;Anyway, that's it for this release of Rogallo. Now I can return to the main
change I was making a start on this week:
&lt;a href="gemini://transjovian.org/titan/index" rel="noopener noreferrer" target="_blank"&gt;Titan&lt;/a&gt;
&lt;a href="https://github.com/davep/rogallo/issues/355" rel="noopener noreferrer" target="_blank"&gt;support&lt;/a&gt;. I've not so much
been putting it off as I have been allowing myself to get distracted by the
above changes -- mostly because I don't quite &lt;em&gt;get&lt;/em&gt; Titan support yet and I
don't have a good location to play around with it. Time to solve that
problem...&lt;/p&gt;</description>
      <guid isPermaLink="false">https://blog.davep.org/2026/09/03/rogallo-v2-2-0.html</guid>
      <category>Coding</category>
      <category>Coding</category>
      <category>Gemini Protocol</category>
      <category>PyPI</category>
      <category>Python</category>
      <category>Rogallo</category>
      <category>smolweb</category>
      <pubDate>Thu, 03 Sep 2026 08:14:57 +0100</pubDate>
    </item>
    <item>
      <title>finger2gemtext - A library for converting finger responses to Gemtext</title>
      <link>https://blog.davep.org/2026/09/02/finger2gemtext-a-library-for-converting-finger-responses-to-gemtext.html</link>
      <description>&lt;p&gt;I've just released the first version of another library in the collection of
libraries that support the development of
&lt;a href="https://rogallo.davep.dev/" rel="noopener noreferrer" target="_blank"&gt;Rogallo&lt;/a&gt;: specifically, another one that helps
convert text in other formats into &lt;a href="https://blog.davep.org/tag/gemtext/"&gt;Gemtext&lt;/a&gt; so Rogallo's
display can be a little richer. In effect, this is a sibling to
&lt;a href="https://md2gemtext.davep.dev/" rel="noopener noreferrer" target="_blank"&gt;&lt;code&gt;md2gemtext&lt;/code&gt;&lt;/a&gt; and
&lt;a href="https://html2gemtext.davep.dev/" rel="noopener noreferrer" target="_blank"&gt;&lt;code&gt;html2gemtext&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;This time it's a library to convert &lt;a href="https://blog.davep.org/tag/finger/"&gt;finger&lt;/a&gt; responses into
Gemtext, where it makes sense. For the most part, finger responses are
free-form plain text, but there are times when there's information in the
response that would be of most use if you could interact with it. For
example, if you get a user list from &lt;code&gt;plan.cat&lt;/code&gt;&lt;sup id="fnref:426-1"&gt;&lt;a class="footnote-ref" href="#fn:426-1"&gt;1&lt;/a&gt;&lt;/sup&gt;, that's a lot of data
that could be turned into &lt;code&gt;finger://&lt;/code&gt; URIs that can be subsequently
followed.&lt;/p&gt;
&lt;p&gt;With this in mind, &lt;a href="https://finger2gemtext.davep.dev/" rel="noopener noreferrer" target="_blank"&gt;&lt;code&gt;finger2gemtext&lt;/code&gt;&lt;/a&gt; can
take a body of text, look at it to see if it might be possible to convert it
to useful Gemtext, and will convert it if that's the case. Given that
there's no standard to be had here, and given that any given response could
be of any form the author desires, I'm making the conversion pretty
conservative.&lt;/p&gt;
&lt;p&gt;What I have done, though, is make it so that the conversion process can be
extended. The &lt;a href="https://finger2gemtext.davep.dev/finger2gemtext/#finger2gemtext.finger_to_gemtext" rel="noopener noreferrer" target="_blank"&gt;&lt;code&gt;finger_to_gemtext&lt;/code&gt;
function&lt;/a&gt;
can be given a collection of additional filtering classes; if the built-in
classes can't find anything to convert, the additional classes get a go.
There is &lt;a href="https://finger2gemtext.davep.dev/finger2gemtext/#finger2gemtext.FingerFilter" rel="noopener noreferrer" target="_blank"&gt;a base class to inherit
from&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I've not fully planned it out yet, but the vague idea I have here is that
Rogallo could, at some point, have &lt;em&gt;"finger plugins"&lt;/em&gt; which will handle
various special cases and site-specific formats.&lt;/p&gt;
&lt;p&gt;For now, though, this gives me the basics that let me turn this:&lt;/p&gt;
&lt;p&gt;&lt;img alt="A plain finger response" height="1632" loading="lazy" src="https://blog.davep.org/attachments/2026/09/02/plain-finger.webp#centre" width="1606" /&gt;&lt;/p&gt;
&lt;p&gt;into something where I can follow &lt;code&gt;finger://&lt;/code&gt; links without the need to
copy/paste/edit:&lt;/p&gt;
&lt;p&gt;&lt;img alt="A richer finger response" height="1632" loading="lazy" src="https://blog.davep.org/attachments/2026/09/02/rich-finger.webp#centre" width="1606" /&gt;&lt;/p&gt;
&lt;p&gt;Now I need to find a few more online finger resources that respond with
things worth making linkable...&lt;/p&gt;
&lt;div class="footnote"&gt;
&lt;hr /&gt;
&lt;ol&gt;
&lt;li id="fn:426-1"&gt;
&lt;p&gt;&lt;code&gt;finger @plan.cat&lt;/code&gt;&amp;#160;&lt;a class="footnote-backref" href="#fnref:426-1" title="Jump back to footnote 1 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</description>
      <guid isPermaLink="false">https://blog.davep.org/2026/09/02/finger2gemtext-a-library-for-converting-finger-responses-to-gemtext.html</guid>
      <category>Python</category>
      <category>Coding</category>
      <category>Gemini Protocol</category>
      <category>PyPI</category>
      <category>Python</category>
      <category>finger</category>
      <category>gemtext</category>
      <category>finger2gemtext</category>
      <category>smolweb</category>
      <pubDate>Wed, 02 Sep 2026 19:21:50 +0100</pubDate>
    </item>
  </channel>
</rss>
