software

Parent tag: technology

Child tags:

Caoimhe

Subtags

In my endless quest to turn the code that generates this website into an ever-more indecipherable mess I have added a hierarchy to how the site defines tags. For instance the tag for my cat Easóg is now a child tag of the cats tag. As such any post tagged with Easóg will now appear under the pages for cats even if I don’t tag the post as cats as well, and the cats tag is a child of the new animals tag so all posts tagged Easóg or cats will also show up under there too. Each tag page also shows its parent tag and any child tags. The site’s RSS feeds will provide the full tag ancestry for each post, so if you are, for example, blacklisting a tag in your feed reader then it should catch any posts with that tag’s child tags applied to it as well.

Consequently I’ve gone back through old posts and trimmed a lot of tags that are now redundant, which should reduce tag clutter under posts, and added tags to other posts where I felt they would be appropriate. I might rearrange how they’re organised a bit more but I think the system in general is working okay now.

The full set of tags can be seen on the tags page.


Caoimhe

What I’m reading vol. ⅩⅥ

Vols.: Ⅰ, Ⅱ, Ⅲ, Ⅳ, Ⅴ, Ⅵ, Ⅶ, Ⅷ, Ⅸ, Ⅹ, Ⅺ, Ⅻ, ⅩⅢ, ⅩⅣ, ⅩⅤ, ⅩⅤⅠ

Today’s musical accompaniment will be relevant further down the post.


Games

Interview with Satoshi Yokokawa — Ashley Rojas

Cool interview with the enemy designer of Sonic 3 & Knuckles. I’ve always thought that the badniks in Sonic 3 had a more industrial look to them compared to the enemies from the previous games and I’ve always really liked that about it and it pleases me to hear the intent behind that being articulated. I also love Mecha Sonic’s design and it’s really lovely to hear him appreciate the fan art and reinterpretations of his designs. Also look at this short fan animation, it’s really cool.

Given that setting, since the Death Egg had suffered enormous damage from crashing due to Sonic's attack in "Sonic 2," I thought the mecha production facilities inside the fortress must also have been heavily damaged, making it difficult to carry out production as before.

From there, I arrived at the idea that Dr. Eggman, needing a fighting force to oppose Sonic under conditions where the production facilities weren't functioning properly, would gather up usable parts and hastily assemble machines to deal with the situation.


mantle.nes breakdown blog part 1 — Melon

First of (so far) two posts where Melon breaks down the development of their NES recreation of the “original game” in Deltarune chapter 3.

I had previous experience working on NES games already - at least, I had tinkered a little bit and had enjoyed enormously Pikuma’s course on beginning-to-end gamedev with 6502 assembly on the NES a few years back, so I felt confident I could pull it off! Even if the journey seemed daunting, I just had to go one step at a time…


The Web

Self-censorship practices as anti-shibboleth — Laura Michet

Oh do I hate algospeak. I stopped talking to a therapist once in part because I lost a massive amount of respect for him for using the word “unalive”.

In my experience, self-censoring adult terminology on that site in particular is a great sign that you're dealing with someone so incurious, with such a limited experience of online conversation, that they don't understand where they are, or who they're dealing with, or who's accountable for maintaining the peace in the community where they're speaking. I do not want to read the things these people write, and I do not want to talk to them. I'd rather not be the person who teaches them to be curious.


Hulagirl.txt — Deli

An investigation into the origin of a classic, old web GIF.

Perhaps enough time has passed that she is merely an inconsequential sighting to the average webuser, a rarity of a signal overlooked in the noise. There was once a time that she danced her way across webpages all over geocities and brought a small injection of joy and energy to whatever page she graced. Early on, she was a known quantity but the passage of time and memory made her mysterious. Stayed mysterious for a long while since, honestly, who really cares about the provenance of a free-to-use gif that is barely 5kB?


I Found Evidence Of My House Spinning — Blackle Mori

Some fiction for once, recommended by Laura Michet again. Interesting use of HTML as a medium.

This is the story of the most inexplicable thing to ever happen to me. It still keeps me up at night, just rolling it around in my head as I fail to make it make sense. This is the story of how I took a video from inside a recurring dream.


Animating Bad Apple with no JS, no CSS, & minimal HTML — Vivian

Explainer of Vivan’s very cute little Bad Apple animation using a technique similar to Geocities HTML Chat.

I wanted to show the Bad Apple animation without JS or CSS, with an impressively minimal set of HTML tags, by abusing slow chunked response, forcing the browser to load the page piece-by-piece. That's happening now (unless you're reading some archive) but how can we use it for animation?


The Crawler Zoo

Less of an article and more of a cool website: The Crawler Zoo monitors and categorises bots that scrape the site. Visitors can even watch bots wander an infinitely generated maze of junk pages.

Every request that reaches the site is examined at the gate. Bots are identified, named, drawn and filed into an enclosure; people are waved through and counted only as an anonymous daily total. Everything you see is live: the figures update as the bots arrive.


Irish

What to use: the “w” or “v” difference in dialects

Improving my Irish is something I’ve wanted to do for a long time but found difficult to sustain long-term, but I do still have occasional bursts of enthusiasm. In this case I found this article, and especially the videos linked within, a good crash course in improving my understanding of Irish phonetics.

When learners come across this difference in pronunciation, they are usually looking at words like “bhfuil” (i.e. “an bhfuil”) and “mháthair” (i.e. “mo mháthair”). How you pronounce it largely depends on which dialect you choose.


The tale behind the Irish translation of Dracula is something to really get your teeth into — Darach Ó Séaghdha

I’ve written about the Irish translation of Dracula before, so of course I was interested to learn a tiny bit more about the history of the book.

Should the Free State find exciting new literary voices working as Gaeilge and bring them to a wider audience, or should they focus on translating bestselling titles that readers had already heard of?

Finance Minister Ernest Blythe took the latter view. In particular, Blythe was very interested to discover that the Berne Convention for the Protection of Literary and Artistic Works had a clause at the time regarding translation rights.


Politics

Europe’s centrists are finally paying the price of their extremism — Yanis Varoufakis

Valve Software’s former in-house hat economist weighs in on the consequences of “centrism”.

Everywhere, it is the same mechanism: Parties that called themselves sensible, pragmatic, and centrist have pursued one of the most doctrinaire economic programmes in European history – and pursued it with a rigidity, an intolerance of dissent, and a contempt for democratic contestation that the actual political extremes of the 20th century would have recognised as their own method, even if they had rejected the content.


Caoimhe

What I’m reading vol. ⅩⅤ

Vols.: Ⅰ, Ⅱ, Ⅲ, Ⅳ, Ⅴ, Ⅵ, Ⅶ, Ⅷ, Ⅸ, Ⅹ, Ⅺ, Ⅻ, ⅩⅢ, ⅩⅣ, ⅩⅤ, ⅩⅤⅠ

I find myself feeling rather inarticulate this afternoon as I sit down to write this, so my comments on each piece shall be brief.


Games

Sandustry is the first factory simulation game I've played that gets heaps right — Edwin Evans-Thirlwell

Sandustry is probably the first factory game I've played that really communicates the physicality of industrial waste, the appalling magnificence of it, for all the dinkiness of its 2D artstyle. It's the only factory game that really makes me think of post-industrial landscapes, like those colossal spoil piles above Aberllefenni. It also engineers a weird exuberance inside the concept of 'byproduct'.

It’s been added to my Steam wishlist.


Technology

CD-ROM Journal - A Trip to 90s Kansai: Exploring the XD FirstClass Network BBS — Misty De Méo

I gestured briefly at the PASSTHRU folder earlier, but I really want to dig deeper into that because this is something very cool. I said before that when you're connecting to a BBS like this, you're connecting to one system rather than the internet as a whole. This is a bit of an exception to that. FirstClass had support for what they called "relays", which allowed BBSs running the same software to talk to each other and exchange messages. It wasn't a realtime connection; this still isn't the internet. It's a little bit more like snail mail. The servers would sync with each other every day, or once every few days, fetching new replies in the conferences they were sharing and transmitting any replies that had been made from a different server. It's quite a bit more "slow internet" than we'd probably tolerate today, but in the pre-internet era the idea you could be talking to these other communities at all would have felt revolutionary.

A really interesting look at early digital communication.


La Fin: I've finished remaking all the websites in H2O: Just Add Water — Alyx Wijers

A little over a year ago, I published a post (“I wasted $410 recreating a fake website that shows up for 10 seconds of a TV show almost no one remembers “) about having re-created a website that showed up for a few seconds in an episode “H2O: Just Add Water”. In the title I described it as “…a TV show almost no one remembers”, which was evidently incorrect, because after posting on Mastodon I discovered that it seemed to be widely known amongst German audiences.

There’s one more fake website that appears in H2O: Just Add Water: greekmythicalcreatures.com

This is just very cute.


An interactive introduction to the terrific experience of rendering Arabic typography and its technical debt — Saleh

To understand why every machine since Gutenberg has wrestled this script and mostly lost, you need one structural fact: Arabic is cursive always. There is no print-versus-handwriting distinction, no block letters. The letters connect in stone inscriptions, in manuscripts, in metal, on screens. Each letter therefore changes shape depending on its neighbours (an isolated form, an initial, a medial, a final), and six letters refuse to connect forward at all, which breaks words into joined clusters and gives the script its rhythm. The shapes are not costumes over some underlying "real" letter. The positional variation is the letter.

Really good read on the history of digital typography for Arabic. Seen from Natalie Weizenbaum sharing it. Speaking of…


I really do think you should learn to use the Linux command line. — Bruno Dias & Natalie Weizenbaum

I really do think you should learn to use the Linux (or Mac, I suppose) command line if you can find the time at all. It is, genuinely, a dramatically more empowering way to use your computer than the alternative, and it will enable to think about your computer as a tool in ways that are completely different.

Cocosigning this post and Weizenbaum also gives a nice quick primer of navigating the command line.


Why do projects reject AI contributions? — Darío Samo

If we were to go by actual lines of code, generated projects easily contain over tens to hundreds of times more documentation and code than human-made ones do. This is intentional by design: the AI companies do not want these projects to be maintainable by anything but their tooling, so you'll have no choice but to keep paying them to work on it.

A good Reddit post from an accomplished game modder on the problems of maintaining or working with generated codebases.


Politics

The End of Trans Rights in the UK Is the Start of Democratic Collapse — Toby Buckle

Unlike, say, Brexit which had rights implications but could point to democratic inputs (however flawed), nothing in the story I told above was backed by any democratic input of any kind. In fact, all of it was elites acting in explicit defiance of the democratic inputs they did receive.

Buckle hammers home how utterly undemocratic the movement against trans rights in the UK is.


The Real Class Politics Behind Ireland’s Fuel Protests — Conor McCabe

The oft-used phrase, squeezed middle, may indeed apply here – not in the mainstream media meaning of cost-of-living and prices, but rather in terms of position-of-production and power. There is of course a qualitative difference between a pushbike and heavy goods vehicle, but when seen in terms of mode and relations of production that difference somewhat fades.

A Marxist analysis of the class position of the Irish fuel protests from earlier in the year.


The End of the 100 Year Government — Simon McGarr

Protection of the property-owning class has been the water that Irish politics swims through, invisible to its fishy participants but explaining nearly everything. It is why our housing crisis exists and why it cannot, apparently, be solved. Solving it would mean a political evolution on a scale of growing legs and lungs and actually climbing out of that water.

An essay on the class priorities of the Irish governments of the last century.


History

The Workers and the Tombs of the Ancient Dead — Margaret Killjoy

Last week I researched the first labor strike in known history. The tomb builders living in a town called Deir el-Medina in Egypt went on strike on November 14th, 1152 BCE. Three thousand, one hundred, and seventy-eight years ago. And their strike looked an awful lot like ours today. They set down their tools and staged sit-ins, they blocked roads, they marched, they engaged in workplace sabotage. They wrote letters to the authorities requesting a redress of grievances. They stole from work. They did everything that we do today.

And a meditation on labour struggle throughout history.


The Empresa de China & the Hapsburg Bid for World Supremacy — Nathan Goldwag

The Jesuits proposed an invasion force to be spearheaded by 10,000 Spanish and Portuguese troops, augmented by 6,000 Filipino auxiliaries and between 5,000-7,000 Japanese Christian mercenaries, leading a two-pronged invasion through Guangdong and Fujian.

A part of colonial history that I had no idea of.


What programme do people use for writing prose in plain text? I usually just write in Markdown format and at the moment usually in Sublime Text, but I was wondering if anyone had other recommendations for writing prose specifically? Needs to be something offline (an actual programme, not a website) geared towards editing and saving out to plain text formats and run on Linux.


I am trying out Novel Writer.


Caoimhe

I want a non-evil version of Bump

A month ago I saw this this Tumblr post screenshotting a Twitter thread about Bump and was enthralled by both its maximalist aesthetics and how utterly evil it was. Now, before I continue I do what to emphasise: Do not install Bump. It is horrendously evil.

Do not install Bump.

The linked post gives you both a good idea of how invasive Bump is and also what is repulsive but also potentially alluring about it: It records as much as it possible can about everything you are doing through every means it has available to it as a phone app, which is quite a lot. This is, as the thread says, shared with everyone that you have linked with on Bump. That of course means it is also recorded and sent to Amo, the company that makes Bump. People often have a very defeatist attitude about privacy, that so many companies are already tracking everything you do anyway, but Amo really go above and beyond with trying to hoover up everything they can about you and with the way this app works I doubt that internal safeguards are much of a priority. A reminder before I go on: Do not install Bump.

Myself and Caoimhe³ both installed it, added each other, and then deleted our accounts after a couple of days. It was even more of an invasive nightmare than I was expecting.

  • If you do not allow access to your contacts straight away it repeatedly badger you to do so. I think it asked me five times before it reluctantly allowed me to continue without doing so.
  • It obvious asks your location permission to work. The basic point is broadcasting your location to people, but even if you grant it location permission it will display constant red warning signs on the main map screen and lock you out of features until you grant Bump permission to read your location at all times, even when the app is closed.
  • It will then also repeatedly ask you to disable power management features for Bump so that it can always keep monitoring you even when your battery is dying.
  • It has a feature to add live widget to your phone’s homescreen that constantly tracks a specific person. Like, stalking your friends at all times is kind of the selling point in the first place, but bloody fuck.
  • It doesn’t just want your raw location it is also interested in what places you hang out in and business you frequent. It locks features behind adding a certain amount of favourite locations that it can log you as being at. Each location also has public leaderboards that shows who is there most often, potentially showing where to find you even to people you never linked with in Bump.
  • In its quest to log and display everything it goes as far as to display your live battery percentage to everyone (so you can’t feign low battery as an excuse for not replying or wanting to go out).
  • Features are locked behind linking with enough people, so even if you were fine with sending all this (live, at all times) to a few people, it will push you to expand that circle.

And yet, I do see some of the appeal. The dwindling of third places gets talked about a lot and I think that something that facilitates spontaneous gatherings by being able to see when friends are nearby or in a group could have value. Back in the day this would be having a local pub where you would go without a plan in the hopes of running into people, but the cost of drinks are so goddamn expensive these days and most people do not want to be functionally alcoholic in order to have a social life any more.

Do not install Bump.

I think a non-evil version of this is possible, thought it would not be straightforward or easily. Something that provided some of this openness, at the discretion of the user, with many safeguards, that did not store any data, and was end-to-end encrypted, could actually have benefits. But it would also never, ever be profitable and would never have the backing that it would need to push it to large-scale adoption. And of course the intersection of people who are safety-focused enough to want these kinds of safeguards and people who are lax enough about privacy to want something like this in the first place is probably quite small.

The other thing about Bump is its maximalist aesthetics. It’s like a ’00s Nickelodeon children’s sitcom’s idea of what smartphones would become. A partner thought that it was aimed at young people who may not have been around for the Y2K aesthetic old web but have seen it evangelised through nostalgic lens. I do find it genuinely quite charming, especially its chat, which allows you to not just customise your textboxes in garish, clashing fashions but allows all elements to be freely moved around, rotated and zoomed, creating an utterly nightmarish form of communication that I kind of love.

Caoimhe urging me to look at her boy.

I do kind of want this as its own thing. Give me the secure, end-to-end encrypted, privacy-focused, overstimulation nightmare group chat. I would probably get bored of it relatively quickly but I feel like I would have a good time for a few days and then again every few months when I’m feeling particularly silly and whimsical.

A chat featuring various elements overlapping messily, with Nanao from Robot Alchemic Drive on top with text saying “hiiiiiii~”
Say hi to Nanao!

Do not install Bump.


Caoimhe

Sign my guestbook!

I have a guestbook page now! This is something I kept meaning to set up for a while but kept forgetting to. Seeing as I already have a comments system with Comentario I have set it up just as a mostly blank page with a comments section and some extra styling. The homepage is also displaying the latest guestbook message and a link to the page. You don’t need to make an account.

I generally do be tinkering with the site a lot without posting about most of the changes. Recently I’ve added more tags, including adding new tags to existing posts, and making custom icons for some old tags that were using emoji as icons.



Caoimhe

What I’m reading vol. ⅩⅢ

Vols.: Ⅰ, Ⅱ, Ⅲ, Ⅳ, Ⅴ, Ⅵ, Ⅶ, Ⅷ, Ⅸ, Ⅹ, Ⅺ, Ⅻ, ⅩⅢ, ⅩⅣ, ⅩⅤ, ⅩⅤⅠ

Hello! I am having a lazy Sunday to kick off the start of March and it seemed like a good time to post some more links.

Musical accompaniment is the Celeste soundtrack, inspired by me having just watched Bizmuth’s video on the world record speedrun and getting emotional watching someone playing the summit again. I think Maddy Thorson might be good at making games.

Apologies for the amount of these that are more bitching about “AI” I will keep that section for the end so you can ignore it if you are sick of reading about that.


Warfare in Dune, Part I: Fighting Faufreluches — Bret C. Devereaux

Starting with something fun: I always enjoy Devereaux analysing fiction from the perspective of historical systems and technologies with a particular eye for the reasons why things were done or made in a particular way in a given time and place.

So we might first ask if this fighting system, at the individual level, makes sense given the fantastical constraints Herbert’s shields impose. And I guess my answer is…sort of? I think the idea of a return to contact weaponry in this context works in the main, but with two main exceptions, which is that the style of contact weapon fighting that dominates is not what I would anticipate and second that the way Herbert also excludes laser weaponry strikes me as perhaps not fully thought out.


Games

Finally, a car mechanic sim where your mates do all the work — Brendan Caldwell

First off I am giving Jank another plug. Go read Jank! Support non-ad ridden publications! They got Alice Bell and Sin Vega (as freelancers)! What more do you dogs want?

I sell the wheels, both tires and rims. This is when I notice a small, uh, discrepancy between the listed "sell price" and what we actually receive into our bank account. Jonty expresses some worry, and tells me to check the computer in the corner of the garage to see how much it's going to cost to buy the new wheels, you know, "down the road" as it were. I look at the prices. I walk away from the computer.

"Let's worry about that later," I say, quietly.


I recreated every katsu curry recipe in Romeo is a Dead Man and almost none of them made me better with swords — James Archer

Despite a decent bit of Rock, Paper, Shotgun’s best being distinctly janky these days (read Jank!) there are still some gems coming out of the old site.

Tasting notes: Also delicious, even if – in spite of the in-game description – it’s about as Indian as sumo wrestling. The butter does make the sauce beautifully smooth, though, and the stacking of the breaded chicken creates a pleasant optical illusion of having more breaded chicken. Just don’t expect, if you make this yourself, to achieve the same yellowish colour as in Grasshopper Manufacture’s artwork. On the basis of this experiment, that would require so much butter that your curry would legally become a croissant.

Effects: Increases defence. I caught my finger while loading the dishwasher with curry-smeared plates and it still bloody hurt. Failure.


Technology and Design

A Look At Some Interesting Linux Terminal Text Editors — Pom

I confess that I work on this blog in Visual Studio Code. For general text editing I usually use Sublime text but since installing Bazzite on my desktop I have been using Kate, but I think I am going to swap back to Manjaro (or maybe try Cachy) soon and back to Sublime with it. In the terminal I have stuck to Vim with some plugins to style it for a while but this is making me think of checking out Fresh.

Another thing I've always been very fascinated by, is terminal writing programs; I think that might come from how often you hear people in videos about Linux talk about how much they use terminal text editors, particularly things like Vim and Emacs get commonly mentioned, and how much more efficient they are compared to their GUI counterparts. I personally also have almost exclusively used plain text editors for basically all writing I was doing on a PC; at school I did use Word, but none of my personal computers ever had MS Office installed; as such, I was already used to writing in programs with very minimal interfaces.


The Slow Death of the Power User — Fireborn

I think there is a bit of a degree of rose-tinted glasses in the reminiscing here. The idea that the culture around technology did not use wield levels of technical competency as gatekeeping or elitism does not ring true to my experience at all. Personally I think that a lot of technically minded communities are a lot better about that now than they used to be, or perhaps it just took me a while to find them. Maybe the eighties BBS scene that Fireborn is hearkening back to was better for this than it would be a few decades later when I was dipping my toes online (was it if you were openly a woman? or gay?).

But I do agree with the central point. The ideal form that technology has centred on in a black box. Something that the owner is not meant to understand or be capable of understanding. Something that cannot be repaired, altered, or used to do anything that is not approved of by its real owners.

That culture didn’t die because the knowledge became irrelevant. It died because it became economically inconvenient. The platforms that replaced the open internet — YouTube, Reddit, Discord, eventually TikTok — are consumption platforms. Their business model requires passive engagement. A user who spends three hours going down a documentation rabbit hole, breaking things in a terminal, and actually understanding something is worth less to them than a user who watches three hours of content. They don’t ban technical material. They algorithmically deprioritize anything that demands active engagement, they reward passive consumption, and they shape the culture of their platform accordingly over years and years until the culture that emerges is one that treats passive consumption as the default relationship with technology.


Have We Forgotten How to Design? — Louie Mantia

And adding to the above, it’s also all, of course, shitty and badly designed.

How has Waymo the technical ability to self-drive a motor vehicle around a city carrying human passengers, but they do not possess the skill to automate closing a door? Did they overlook every method that might encourage the passenger to close it themselves? Was there no other possible method to get the door in a closed state without resorting to a third party that commissions human drivers to drive over to the automated car and do it manually?


“AI”

15+ years later, Microsoft morged my diagram — Vincent Driessen

Everyone running every major company really does not give a single shit about anything any more other than shareprice. It’s good for the economy when the entire thing is hollowed out in the name of gambling, right?

The AI rip-off was not just ugly. It was careless, blatantly amateuristic, and lacking any ambition, to put it gently. Microsoft unworthy. The carefully crafted visual language and layout of the original, the branch colors, the lane design, the dot and bubble alignment that made the original so readable—all of it had been muddled into a laughable form. Proper AI slop.


Toolmen — Mandy Brown

Sorry, I meant in the name of gambling and eugenics.

This has always been the intention of AI, and where its connection to the intelligence-rankers of years past is cruelly apparent: if those in power cannot prove that a great many people are already inferior then they will bring that inferiority about by forcing them to use a tool that diminishes their intellectual and creative capacity. I think of the engineers and designers who have spent decades honing their skills, deepening personal and public creative practices in service both to the users of the systems they built and to their own brilliant spirits, now being told to park themselves in front of a sycophantic oracle that can be appeased only through rote dictates, and which never tires of lying even as their own minds and muscles atrophy from disuse. What is being automated here: the work or the people?


Tunic, Night in the Woods Publisher Says TikTok Is Creating and Running Racist GenAI Ads for Its Games Without Permission — Rebekah Valentine

And of course these systems themselves are also opaque, horrendously designed, and shitty.

What really is utterly baffling is what appears to be a profound void where common sense and business sense usually reside. Does TikTok want me to be grateful for the mistreatment of my company and our game? Based on the wild response through the weeks of customer service correspondence we have received, I think this is their stance and take on their obvious offensive and racist technology and process and how they secretly use it on the assets of their paying clients without consent or knowledge.



I feel like with HTTP responses the scenarios of “the URI you are trying to access is not a valid or defined endpoint” and “the URI is valid but the specific thing you are requesting doesn’t exist” should not both be 404 errors. Those should be two different things.


Caoimhe

What I’m reading vol. Ⅻ

Vols.: Ⅰ, Ⅱ, Ⅲ, Ⅳ, Ⅴ, Ⅵ, Ⅶ, Ⅷ, Ⅸ, Ⅹ, Ⅺ, Ⅻ, ⅩⅢ, ⅩⅣ, ⅩⅤ, ⅩⅤⅠ

Oh it is has been a while since I posted one of these and I have built up quite a backlog of links.

Musical accompaniment for this volume chosen mostly to cause psychic damage against my partner.


Da Web

The State of Modern AI Text To Speech Systems for Screen Reader Users — Samuel Proulx

Interesting insights here into how the uses of text to speech for sighted and blind people are fundamentally different and how functionality for the latter is usually, unfortunately an afterthought.

Supertonic is slightly faster, as it can stream result audio as it becomes available, whereas Kitten TTS cannot start speaking until all of the audio for the chunk is fully generated. But for use in a screen reader, a text to speech system needs to begin generating speech as quickly as possible, rather than waiting for an entire phrase or sentence. Users of screen readers quickly jump through text and frequently interrupt the screen reader, and thus require the text to speech system to be able to quickly discard and restart speech.


A tale of two Webs — Oblomov

A lot of the development efforts (both creative and destructive) in web browsers in the last decade+ has been going into fostering the “web app” vision of the web, to the detriment of the “web of documents” vision. From the removal of native support for RSS and Atom feeds to the introduction of JavaScript APIs like WebUSB or the Web Environment Integrity attempt I already discussed in the past, nearly all work done on browsers has been in this direction.

I feel this a lot. The web of documents now lives in the margins of the web of apps and with Google’s capturing of standards has made maintaining a web browser to keep up with the former impossible without the backing of Google or other huge companies who are increasingly hostile to users having any agency. I feel similarly about operating systems at this point, too. I abandoned Windows on my home computer years ago and since then it has become ever more hostile to users having control over what their machine does. This isn’t new, simply an acceleration of trends that have existed for a long, long time.

As much as I want the “AI” bubble to burst I do wonder if the push for “agentic” systems might actually stick simply from the obscene amounts of money being powered into trying to make users handing over nearly all agency and control of their machines to chatbots actually work or be desirable. Currently Windows still does allow itself to be used as an actual desktop operating system, but clearly Microsoft at this point want to push everything towards locked-down, controlled and monitored black boxes, possibly even worse than phones possibly are. How long till they think they can get away with amputating the shrivelled lump of the desktop operating system, cut off direct user access to the filesystem outside of what you have in Dropbox that you pay a subscription for and lock everyone into software from the app store for everyone but enterprise customers who can pay through the nose? Or at least just keep breaking core parts of the operating system until they’re barely useable.

On a more positive note this article also prompted me to add metadata to the site that will work with the Website Navigation Bar addon for Palemoon if you’re using that because I thought it was cute and it was easy to do as I was already using that information to render on-page navigation elements anyway.

And speaking of the web of documents…


Consider Making 2026 the Year of the Personal Website! — The Virtual Moose

I know I’m going to be preaching to the choir with the kind of people who are reading a personal blog already, but still.

I think it’s also just fun to see what old posts still get traffic. My most popular posts on here are very old ones about how to play the late 90s MMO Asheron’s Call today, ttrpgs based on video games, and the late 90s Microsoft puzzle game Pandora’s Box. It’s more useful and permanent than an unwieldy thread of posts on bluesky or mastodon too, where you would have to refresh it for anyone to even come across it again.


Stolen Focus — Luna

I do still have to catch and reset myself with various bad computer and social media habits every once in a while. It’s easy to fall into when you are tired and sore and everything that would be interesting or engaging or useful just feels like a massive hump to get over.

By this time, however, I had become once again hopelessly addicted to social media. I wasn’t getting notifications, and I wasn’t fixated on numbers any more, but I was still compulsively checking and refreshing, desperate for the feed to give me another hit of dopamine. I lost hours each day to flicking through TikTok any time I had a quiet moment — rather to flood my brain with stimulation than have to sit in uncomfortable silence even for a moment. A partner and I would engage in a habit we called “TikTok time”, where we’d screen-share the videos we’d Liked recently with each other. Increasingly I was finding I had little to show for the hours I’d spent scrolling the feed. It had become akin to a slot machine; I kept scrolling and scrolling in the hopes that maybe the next video would be something I wanted to see — whatever that was.


Payment processors were against CSAM until Grok started making it — Elizabeth Lopatto

What else is there to say?

So why is X different? It’s run by Elon Musk. “He’s the richest man in the world, he has close ties to the US government, and he’s incredibly litigious,” says Pfefferkorn. In fact, Musk has previously filed suit against the Center for Countering Digital Hate; in a now-dismissed lawsuit, he claimed it illegally collected data showing an increase in hate speech after he bought the platform formerly known as Twitter.


Games (general)

Horses Is Tame — Chris Person

But of course, if you want to make art…

This is a hegemony of American prudishness, applied globally, incoherently, unevenly, and unseriously. Anybody responsible for these decisions would be vaporized in seconds by a Pinku movie from the 1970s, and if a single person in this chain of command has an arts degree they are pretending they don’t for the sake of an ill-defined idea of business.


Alternative Games From The Fringes Of Cyberspace — Nathalie Lawhead

And a somewhat more hopeful view on being considering unmonetisable.

The games that exist outside the mainstream, and I think the type of personal empowerment they represent, is what makes them “controversial”.
Especially under the scope of mainstream culture where everything needs to sell, satisfy a commercial value, be consumer centric, or live up to such capitalist standards.

Unmonetized self expression is an act or resistance in today’s tech landscape.


Why we are making Jank — Brendan Caldwell

Games journalists Jon Hicks, Brendan Caldwell and Graham Smith have launched a new games site called Jank that fails to live up to its name by functioning well and not being bloated with ads, tracking, affiliate links, chatbots and other crap that turns sites into a churn of advertisement-friendly sludge.

Perhaps less obvious is the kind of writing that disappears in the process. Articles about new games, niche games, and experimental work don't get traffic, so off they go. Deeply researched columns from subject matter experts don't get traffic, so they’re cut. Not many people read interviews, unless you can get someone to say something controversial and pull it out as a news story, so it’s rarely worth talking to developers about their work. Articles designed purely to entertain with daft jokes, such as diary series, don't deliver numbers at scale no matter how much their readers adore them.

Will this work out? Can they make enough money doing this to actually make a living? I don’t know but I hope so, and I hope they make enough that they can round up a few other Rock, Paper, Shotgun veterans as well. They are also trialling a partnership with the Total Playtime podcast which I am a fan of as well. Supporting one will give you access to the membership perks of the other, at least for the next few months.


The gamers hate generative AI — Laura Michet

Gamers rise up.

I've assumed for a while that gamers would have mild distaste for genAI material, in the same way that they have distaste for asset store assets and, for some reason, the Unity engine. It turns out that I was wrong - they hate it a lot more than either of those things.


Games (specific)

“interest sources”, contextual interactions for NPCs in Sleight of Hand — Joe Wintergreen

On the more technical side of games I always like reading Joe Wintergreen’s breakdowns of how systems work.

A scenario I’ve found useful to expose a lot of edges cases is a guy pissing against a wall and leaving a puddle of piss. Support this scenario with no aberrant behaviours and you are doing okay.


Abstraction in Rhythm Doctor — Blueberry Lemonade

How are layers of abstraction perceived? What expectations do they set? At what point do UI elements stop being representational and start to become part of the fiction itself?

It sounds small (and it is), but it was a firm example in my mind of how the game was changing the longer we worked on it. Instead of characters simply appearing and disappearing in abstract space whenever they were needed for gameplay, we were now introducing the idea that they are real characters standing in real rooms that are connected to each other. They can walk, or run, from one place to another. They’re living lives of their own when they aren’t being treated.


The Great Celeste Race 2026 — Caoimhe³

Caoimhe wrote a much better narrative of the annual Celeste race than mine.

This part was a delight. Ruby and I swapped the lead as we often did, but with microscopic gaps becoming the norm. A single death in a puzzle would swap the lead, and hesitating would throw away any advantage we may have had. I lose the lead at the end of the 1500 metres section, at a puzzle I know I hate, and pull it back cleanly at 2000 metres. At 2500 metres, I had a small lead, but here is where the dream ends.


list animals until failure — Vivian

Here is a new blog with a strong, realistic, game plan for updates and a fun post about the suffering involved in defining how many animals there.

If you’re an entomologist, or an evolutionary biologist, you might say “well, bees and ants are just wasps, really”, and I respect that. But colloquially, bees and ants aren’t wasps. If this game insists on a purely phylogenic approach, then it’s like, come on, I can’t get a point for saying wasp and ant? That’s unreasonable. If I ask a 2-year-old to list animals and she lists wasp and ant, I’m not gonna break out the DNA sequences like “Ohh well evolutionarily ants are technically wasps”. I’m gonna say yeah, good job, that’s two animals.


Serious stuff (trans)

'A Directive From Above': Former NYT Editor Lays Out How The Paper Pushes Anti-Trans Bigotry — Billie Jean Sweeney

A look into how hatred and transphobia gets pushed down from above in the media.

She assigned it to a UK correspondent, who wrote it in the context of UK politics, talked about it being very contentious, talked about the criticisms of its findings. Cass was talking about them herself, this isn't jumping to any conclusions at that point. It really put it in the context of being this very contentious, very political sort of document.

When I saw it, because we're a few hours behind, there were 600, 700 words written. I had a pretty good sense of how the story was going to turn out. But within a few hours the story was to the top New York editors, and I don't know who exactly it was who did that. I assume it was Carolyn or her intermediary. They said ‘oh no, we want the science desk to do that,’ specifically that was Azeen [Ghorayshi], who had been a key reporter in a lot of the other anti-trans coverage.


I bear the scars of a healthcare system that fails trans people — Jenny Maguire

And another article on the Loughlinstown gender clinic being awful to throw on the pile.

“Oh wow,” she said. “Did you do this yourself?” Immediately, I felt her fingers running through my curls, as if I was a glamorous dog being poked and prodded. Still, I put on a smiley face and went along with this condescending charade. I knew what I needed, and I was not going to cause a fuss — as if I had any choice.


Serious stuff (general)

Outlive The Bastards — Caoimhe³

May we.

There's been several eye-opening moments for me in the past few years. Realisations that we can simply do things never before imagined. These rolling revelations haven't stopped. I can live and love in ways I was never able to before, and nothing can stop this.

So we live. But only in a way that works for us. We dictate how we breathe, how we act, how we medicate, how we live and how we die. How long did I spend dancing to other peoples' tunes, hoping and begging to be given basic respect, only to be thrown aside? Never again.


TrAPPed: Arrested by Phone — Anand RK, Suparna Sharma & Natalie Obiko Pearson

Bloody fuck.


shit i keep seeing: “conflict resolution” via gaslighting — Joe Wintergreen

I fear that I may been this person before but I know I have definitely worked with a guy who did this.

I guess what I’m seeing is guys who’ve never learned to resolve conflict, only to “win”, overcorrecting and becoming what might be termed “conflict-avoidant”, but their avoidance strategy is pretending, the moment there is a conflict, that there isn’t one. If they can get this past everyone in the moment, face is saved and they’re off the hook for a true resolution.


We Don’t Need Any More Renewables — Adapt : Survive : Prevail

I am endlessly frustrated by people thinking that if we just have more renewable energy then everything else about our suicidal systems of exponential growth and resource extraction will be fine.

So in plain language, here is the actual claim: “We have no choice but to meet all electricity demands and doing so via renewable energy increases greenhouse gas emissions by a lesser amount than fossil fuels.”

Now that we have clarity on the actual claim, we can break it down. The reality is this: 1) We absolutely do have a choice because demand is politically, economically, and socially constructed, and 2) The choice between renewables and fossil fuels is a false binary, like telling a healthy person they must chose between losing an arm or a leg.


Meaning, Memory and Christmas in Ireland — Seán MacBrádaigh

A brief dive into the complex place of Catholicism in Ireland.

A new state, born of revolution, civil war and counter-revolution, sought stability through moral uniformity. In doing so, it aligned itself closely with a powerful and highly conservative Catholic hierarchy, outsourcing social order, education, health and morality to the Church. This was not a neutral partnership. It produced an official vision of Irishness that was narrow and exclusionary - defining virtue and respectability in rigid Catholic terms.


Caoimhe

You can now hide tags on this site

The page for each tag on this site now has a button to hide that tag, so if you don’t want to see me posting about Doctor Who you can visit that tag’s page and select to hide it. This will hide those posts entirely from the homepage list and elsewhere will collapse them with a button you can click if you want toggle the visibility of the individual post and another button to remove any tags that that post has from the hidden tags list. I’ve set it so that tags for adult topics are hidden by default.

This is done with a hundred and thirty-odd lines of Javascript and stores the tags one has hidden in one’s browser’s local storage and so will persist between visits on the same device but will not transfer to any other browser or computer and it doesn’t send any data to me.

By the way, tags are also included in the site’s Atom feed and some readers support blocking tags as well (I believe that Newsblur does), though other readers (like Feedbin) just ignore tags entirely and don’t even show them.


Caoimhe

Tags page!

Something that should have been obvious with adding tags but I didn’t think of until after the fact: There is now a tag page showing all the tags used on the website, ordered from most ot least used. I also added some more tags and went back and retagged a lot of posts.


Caoimhe

Tags!

After a year I have finally added a functioning tagging system. I had been tagging posts already but they were pretty much non-functional, just sitting at the bottom looking pretty. Now every post has some category icons under it. Mouseover each for titles if it’s unclear what they’re meant to be. As well as posts the tag pages include reviews and gallery exhibits.



if Windows is going to demand line endings be \r\n it should actually treat them as separate operations and not one thing. If it sees a \n character on its own it should put the output onto the next line without returning to the start of the line instead of just doing nothing. if it sees an \r character on its own it should start layering lines on top of each other



I got an MRI done a little while ago and I decided to download the data for it from the clinic just because I could and apparently the KDE Dolphin file browser has a thumbnail for MRI data files

A thumbnail for a computer file depicting a brain.

When I post reviews to my blog I include a star rating in the title with star characters like this: ★★★☆☆

I want this not to be a mess for screen readers so I decided to wrap them in spans with ARIA labels like this: <span aria-label="3 stars">★★★☆☆</span>

But trying to look more into accessibility I am finding people saying that aria-label should only be used on interactive elements or elements with a specific role assigned and not general text but then I am not sure what alternative to use here to make this work better. Does anyone have any specific suggestions for what to do here or good general guides on accessibility to read?

Also is there any practises over labelling things that are correct names but that screen readers are probably going to struggle with. E.g. the new Gundam show is officially called “Mobile Suit Gundam GQuuuuuuX” which I understand is meant to be pronounced something like “G-Quacks” or labelling “Kevin Can F**k Himself” to be clearly pronounced without the censoring.

Another weird question I’ve thought of: Does having a span in the middle of a word (e.g. if yo were doing some decorative text on just part of a word for whatever reason) fuck up accessibility? Or even bolding or italicising parts of words? Like if I write unimportant to indicate I am emphasising that part of the word?


Incredible web design from my insurance company. The name field is automatically filled with my account details and is not editable but then fails validation due to the presence of a fada in my name. This is an Irish company. Editing the value of the form with my browser developer tools of course allows me to submit with no problem.

A form with an error calling my legal name invalid.

Caoimhe

Splicing in The Big O’s original intro with FFmpeg… again!

I have posted before about using FFmpeg to restore The Big O’s original intro and also my Jellyfin server. I am going to talk about the former again but first some more detail on the latter.

My Jellyfin server is actually just my desktop, which acts as server for everything on my home network. It has a 12TiB hard drive for storage which is divided up into a few partitions, one of which is my “library” partition of important files I want to keep, and which I make regular backups of, and one of which is my “media” partition that holds the files for my Jellyfin server. The media partition was running out of space (I may go a bit extreme with the bluray rips) and the library had several times more free space than used, so I decided to try to resize them and grow the media partition into some of the library partition’s empty space.

I just used KDE’s built-in partition manager for this, which successfully shrank the library partition but for some reason failed when trying to grow and move the media partition. I don’t know why this happened and am just hoping there’s no hardware problems. Nothing from the library partition was lost (and it was all backed up anyway) but the media partition was gone and so I’ve had to rebuild my Jellyfin library. This is not a huge deal it’s just been a little time-consuming but one of the things that was lost was, of course, my edited Big O episodes, which meant that I had to redo splicing the original intro in. But I had a fresh head again, free of the frustrations accumulated while trying to do this the first time, and I decided to do it better and actually get to grips with FFmpeg’s filter syntax. Here are the commands I ended up with:

mkdir -p tmp
mkdir -p out
for v in The\ Big\ O*.mkv
	set b (basename "$v" ".mkv")
	ffmpeg -i intro.webm -ss 00:01:12.02 -i "$v" -filter_complex "[0:v] scale=1424:1080,setsar=1:1 [intro]; [intro][0:a][0:a][1:v][1:a:0][1:a:1] concat=n=2:v=1:a=2 [outv][outa];" -shortest -map "[outv]" -map "[outa]" -metadata:s:a:0 language=eng -metadata:s:a:1 language=jpn "tmp/$v"

	set subs "$b.ass"
	ffmpeg -itsoffset -4.42 -i "$v" "tmp/$subs"
	ffmpeg -i "tmp/$v" -i "tmp/$subs" -shortest -map 0 -map 1 -c copy -metadata:s:s:0 language=eng "out/$v"
end

Let’s break down what’s happening here. First I create two directories, tmp and out. tmp is where temporary working files are going to be written to and out is for the final files when we’re finished processing.

Then loop over each episode matroška file with the file name for each one assigned to $v inside the loop. The file name without the file extension is set to the variable $b. I’m using a Fish shell here rather than Bash so the syntax is a little different to Bash.

Then the big command. We pass in the first input, intro.webm, which is the intro that I downloaded off of Youtube. Our second input is the episode, with the seek parameter -ss telling FFmpeg to skip to one and twelve point zero two seconds in when reading it. This is, unintuitively, set before you specify the input it applies to, not after.

Then the big -filter_complex. This takes a big string that takes filter definitions separated by semicolons. Each filter has input and output streams identified by labels in square brackets.

The first filter is [0:v] scale=1424:1080,setsar=1:1 [intro]. Its input is [0:v], the video stream from the first input1, i.e., intro.webm. It then resizes it to a resolution of 1,424×1080 pixels and sample aspect ratio of 1:1 and outputs it to a new stream labelled [intro]. The [intro] stream now has the same resolution as our episodes which will allow us to concatenate them in the next filter.

The second filter is [intro][0:a][0:a][1:v][1:a:0][1:a:1] concat=n=2:v=1:a=2 [outv][outa]. Let’s start in the middle here. concat=n=2:v=1:a=2 means that we are going to concatenate two segments (n=2) which each have one video stream (v=1) and two audio streams (a=2). Those two audio streams are going to be the English and Japanese dubs.

The inputs for this filter are [intro][0:a][0:a][1:v][1:a:0][1:a:1], which can be divided into our two segments—[intro][0:a][0:a] and [1:v][1:a:0][1:a:1]—which each have one video and two audio streams specified. The first segment has our resized intro video stream, [intro], and [a:0] is the audio from our first input (the intro again) specified twice because we are going to combine the same intro audio with both the English and Japanese episode audio. The second segment has the video and two audio streams from our second input file; the episode itself and its English and Japanese audio tracks.

The concatenation then has two output streams, [outv][outa], the video and audio.

Then the rest of the command: -shortest makes sure that the output of the command is equal to the shortest stream in the output, i.e. if your output has five minutes of video but only two minutes of audio then the output will be two minutes long rather than five minutes of video with three minutes of silence. I think that shouldn’t really be needed here but I was using it while testing and forgot to remove it and thought it would be dishonest to take it out for the post when it was what I actually ran.

-map "[outv]" -map "[outa]" defines what streams to include in the output, which here is simply the output streams of our concatination.

-metadata:s:a:0 language=eng -metadata:s:a:1 language=jpn labels the audio output streams as being English and Japanese, respectively, so that media players can display that information.

And then the last part of the command is ouputting the video to the tmp folder.

This gives us output files with the original intro with both dub tracks preserved, which is more than I had last time and with a lot less processing. But if I am going to include the Japanese audio I probably also want subtitles for that and unfortunately the -ss parameter does not seem to correctly offset the subtitles. If I want subtitles with correct timing I will have to fix them with another command.

First set a variable, $subs to the file name we want for the subtitles in the Advanced SubStation format.

Then read the original episode file into FFmpeg again with a negative offset of 4.42 seconds (-itsoffset -4.42) and write the subtitle data to a file in the tmp folder.

The last command is taking in out output video and the subtitle file and recombining them, using another metadata command to label the subtitle track as English, setting the codec mode (-c) to copy so that the audio and video do not get re-encoded and writing the finished file to the out folder.

I didn’t bother fixing the chapters this time.

  1. FFmpeg indexes from 0, so [0:v] refers to the video stream from the first input, [1:a:0] refers to the first audio stream from the second input, etc. ↩


Caoimhe

Font optimisation

I have done some tweaks to fonts on the site. In particular I optimised the fonts I use for headings on the homepage using the pyftsubset command in Font Tools to consist only of the characters needed to display the text used on the site and no more. This should reduce the download footprint of the site a bit.

I don’t remember who I saw link to pyftsubset originally so can’t give credit for where I saw it, unfortunately.


Caoimhe

Splicing in The Big O’s original intro with FFmpeg

I have an updated version of these commands in a new bog post.

I have been rewatching The Big O with my partner from bluray rips and as nice as it is to watch it in so much higher quality than when I saw it as a kid but the bluray release lacks the original iconic intro, which is presumably related to the fact that it’s basically Flash by Queen over the visuals of the intro for Ultraseven.

I know enough FFmpeg to be a danger to myself so I decided to spend far too much time banging my head against my keyboard until I managed to splice the original intro into all the episodes. There was a good bit of trial and error and fixing things and adjusting commands but I decided to document a cleaned up version of the steps mostly as a reference material for myself if I decide to do something like this in the future but if it helps anyone else then that’s cool.

What I have below is definitely not the best way to do this. I ended up reprocessing the same videos multiple times which is inherently going to result in a loss in quality and I lost information like subtitles and the Japanese audio track by converting from Matroška files to plain MPEG-4s but I wasn’t using those anyway.

1. Prepare the intro

I used yt-dlp to download the intro from Youtube as it wasn’t included in the bluray files and then blew it up to the same resolution as the bluray rips, 1424×1080.

yt-dlp 'https://www.youtube.com/watch?v=s7_Od9CmTu0'
ffmpeg -i The\ Big\ O\ Opening⧸Intro\ Theme\ \[720p\]\ \[s7_Od9CmTu0\].webm -vf "scale=1424:1080,setsar=1:1" intro.mp4

2. Preparing files

I copied all the episodes that had the intro I wanted to replace into a folder. Episodes one and two of the first series and episodes one, eight and thirteen of the second series have special intros so no processing needed to be done on them. For step 4 it turned out that spaces in the filenames broke the command and I couldn’t figure out how to properly escape them so while preparing the files also remove any spaces or other characters that might cause problems from the filenames.

3. Strip the existing intro

I loaded episodes up in Kdenlive just to check the exact length of the existing intro on the episodes and found it to be 1′12″ and so wrote a command to iterate over all the files and write out an MP4 version with the English audio track (the second audio track in the file, but mapped as 1 in the command as FFmpeg indexes from 0) with that much time cut from the start.

I use a Fish shell rather than Bash. If you use Bash or a different shell you will need to adjust the commands.

for v in *.mkv
	set b (basename "$v" ".mkv")
	ffmpeg -i "$v" -ss 00:01:12.01 -map 0:v -map 0:a:1 "$b-nointro.mp4"
end

There were a couple of episodes where it turned out that there was still one frame of the old intro left at the start so those had to be reprocessed with the start time set to 00:01:12.02.

4. Splice in the original intro

I moved the downloaded intro file into the same folder as the episodes and spliced it into the files. This broke when there were spaces in the filenames and I wasn’t able to escape it properly so I ended up just stripping spaces out and renaming the files back with KRename afterwards.

for v in *-nointro.mp4
	set b (basename "$v" "-nointro.mp4")
	ffmpeg -i intro.mp4 -i "$v" -filter_complex "movie=intro.mp4, scale=1424:1080 [v1] ; amovie=intro.mp4 [a1] ; movie=$v, scale=1424:1080 [v2] ; amovie=$v [a2] ; [v1] [v2] concat [outv] ; [a1] [a2] concat=v=0:a=1 [outa]" -map "[outv]" -map "[outa]" "$b-intro.mp4"
end

5. Fixing chapter metadata

The episodes had some chapter metadata dividing up parts of the episode, with the first one covering just the episode intros, which cutting out that part of the video removed. I decided to fix that with the versions with the restored intro, even though obviously I am never actually going to skip it in practise. The first step of this was outputting the metadata to a text file.

for v in *-intro.mp4
	set b (basename "$v" "-intro.mp4")
	ffmpeg -i "$v" -f ffmetadata "$b.txt"
end

I then manually adjusted the metadata entry to restore the Chapter 01 entry, putting it above the existing chapters in the file. Most of them had their Chapter 01 entry wiped out so I just added it in above the Chapter 02 entry, though some of them still had a Chapter 01 lasting just a few milliseconds so for those I just modified the END time for it. The new intro was 1′7.61″ which meant a 67,610ms timestamp. I also changed the START entry for every Chapter 02 to 67610 to match.

[CHAPTER]
TIMEBASE=1/1000
START=0
END=67610
title=Chapter 01

Once they were all updated I applied the modified chapter metadata back to the files

for v in *-intro.mp4
	set b (basename "$v" "-intro.mp4")
	ffmpeg -i "$v" -i "$b.txt" -map_chapters 1 -codec copy "$b.mp4"
end

6. Done!

Then I deleted all the intermediary files and dropped the processed files into my Jellyfin server along with the episodes that didn’t need fixing.


Caoimhe

My Jellyfin server

I really like Jellyfin. It’s sort of an open-source Plex. I run a server that is just on my local network that lets me watch films and television shows from my desktop, couch, phone or anything else on my home network and even simply organising everything is very pleasing to me. I spend far too long picking covers and artwork for everything, sometimes even making my own, like when I made an Irish logo and cover for Na Conriochtaí when I couldn’t find one to match the official Irish posters for the other two Cartoon Saloon folklore movies.

My collection for the Cartoon Saloon Irish Folklore Trilogy in Jellyfin.
I went through the official logos from as many languages as I could find to get all the letter shapes to put the Irish logo together for Wolfwalkers.

It has some other really nice features as well like telling you what time something will end at if you started playing now and letting you easily have multiple version of the same film under the same entry, letting you as easily select them as you would the right language for a movie with multiple audio tracks, so you can have both a bluray rip and the Morton Jankel cut of Super Mario Bros. together or the official black and white cuts of Fury Road or Johnny Mnemonic alongside the colour versions.

The Matrix in Jellyfin, showing a scan of the theatrical print as the version selected.
No green tint here!

And of course you can also customise the artwork for all the different media categories, so mine look like this:

My Jellyfin server where all the categories at the top for films, television, music, etc. all feature different versions of Sonic the Hedgehog.

Caoimhe

Migrating comments from Cusdis to Comentario

The story so far: I was using Cusdis to provide a comments section for the bog but it proved to be broken and unmaintained so I replaced it with a self-hosted instance of Comentario.

I am going to walk through what I did to set up Comentario and import old comments from Cusdis. This is not a guide and the scripts that are posted below have serious problems that should be fixed before being used and I am not going to be the one to do that and you would obviously need to change any references to oakreef.ie to your own site.

Subdomain

First of all I needed to have an address to host the Comentario instance at. I chose a new subdomain at comments.oakreef.ie and had to update my Let’s Encrypt certificates to cover that new subdomain. I did not save the commands I used to do that but it was pretty straightforward to do from the command line.

Docker

Then I installed Docker on my server and following Damien’s example with a few tweaks I created my docker-compose.yml and secrets.yaml files.

docker-compose.yml

version: '3'

services:
  db:
    image: postgres:17-alpine
    environment:
      POSTGRES_DB: comentario
      POSTGRES_USER: {INSERT POSTGRES USERNAME HERE}
      POSTGRES_PASSWORD: {INSERT POSTGRES PASSWORD HERE}
    ports:
      - "127.0.0.1:5432:5432"

  app:
    restart: unless-stopped
    image: registry.gitlab.com/comentario/comentario
    environment:
      BASE_URL: https://comments.oakreef.ie/
      SECRETS_FILE: "/secrets.yaml"
    ports:
      - "5050:80"
    volumes:
      - ./secrets.yaml:/secrets.yaml:ro

secrets.yaml

postgres:
  host:     db
  port:     5432
  database: comentario
  username: {INSERT POSTGRES USERNAME HERE}
  password: {INSERT POSTGRES PASSWORD HERE}

Changing the ports configuration to 127.0.0.1:5432:5432 means that the Postgres database is only accessible from the server locally and not publicly available. I also don’t have an email setup for the Comentario instance currently.

Launching the instance is then just a matter of:

sudo docker compose -f docker-compose.yml up -d

Nginx

Then I needed to modify my Nginx config to direct comments.oakreef.ie to the Comentario instance running on port 5050.

server {
	server_name comments.oakreef.ie;

	listen 443 ssl;

	ssl_certificate     /etc/letsencrypt/live/oakreef.ie/fullchain.pem;
	ssl_certificate_key /etc/letsencrypt/live/oakreef.ie/privkey.pem;
	include /etc/letsencrypt/options-ssl-nginx.conf;
	ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;

	location / {
		proxy_pass http://127.0.0.1:5050;
		proxy_redirect off;
		proxy_http_version 1.1;
		proxy_cache_bypass $http_upgrade;
		proxy_set_header Upgrade $http_upgrade;
		proxy_set_header Connection keep-alive;
		proxy_set_header Host $host;
		proxy_set_header X-Real-IP $remote_addr;
		proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
		proxy_set_header X-Forwarded-Proto $scheme;
		proxy_set_header X-Forwarded-Host $server_name;
		proxy_buffer_size 128k;
		proxy_buffers 4 256k;
		proxy_busy_buffers_size 256k;
		add_header Cache-Control "private";
	}
}

Importing comments

Once there were a few comments on the new system I used the export feature in Comentario to get a JSON file and looked at how Comentario defined comment data in that. I also manually went through all the comments on the old system and made a basic CSV file of all of them with the author name, date posted, the URL of the post the comment was on and the text of each comment. I then wrote this Python file to take the exported Comentario comments—named basedata.json—and the CSV with the old Cusdis comments—comments.csv—and exported a new file with the combined data in the Comentario format.

There are some problems with this!

  1. When importing data Comentario does not check for duplicates. I ended up creating duplicates of all the new Comentario comments that already existed on the site doing this and had to manually delete them. If you are doing this do not include existing comments as part of the file you are creating to import.
  2. I did not include replies at all. I decided to try importing replies I had made to people as a second, separate, step (see the second Python script below). This made things more awkward down the line. Do everything in one batch.
import csv
import json
from datetime import datetime, timezone
from dateutil.parser import parse
from pprint import pprint
from uuid import uuid4

now = datetime.now()
pages = {}
site_url = 'https://oakreef.ie'
date_format = "%Y-%m-%dT%H:%M:%SZ"

my_id = "ADMIN USER UUID"

with open('comments.csv', newline='') as csv_file:
		csv_reader = csv.reader(csv_file, delimiter=',', quotechar='"')
		for row in csv_reader:
				author, date, url, text = row
				date = parse(date)
				
				if url not in pages:
					pages[url] = {
						'comments': []
					}
				
				pages[url]['comments'].append({
					'author': author,
					'date': date,
					'text': text
				})


with open('basedata.json') as json_file:
		data = json.load(json_file)

domainId = data['pages'][0]['domainId']

for url, page in pages.items():
	page_id = str(uuid4())
	data['pages'].append({
		'createdTime': now.strftime(date_format),
		'domainId': domainId,
		'id': page_id,
		'isReadonly': False,
		'path': url,
	})

	for comment in page['comments']:
		comment_id = str(uuid4())
		data['comments'].append({
			"authorCountry": "IE",
			'authorName': comment['author'],
			'createdTime': comment['date'].strftime(date_format),
			"deletedTime": "0001-01-01T00:00:00.000Z",
      "editedTime": "0001-01-01T00:00:00.000Z",
      "html": f"\u003cp\u003e{comment['text']}\u003c/p\u003e\n",
			'id': comment_id,
			'isApproved': True,
			'isDeleted': False,
			'isPending': False,
			'isSticky': False,
			'markdown': comment['text'],
			"moderatedTime": comment['date'].strftime(date_format),
			'pageId': page_id,
			'score': 0,
			'url': f'{site_url}{url}#comentario-{comment_id}',
			'userCreated': '00000000-0000-0000-0000-000000000000',
			"userModerated": my_id
		})


with open('import.json', 'w') as import_file:
	json.dump(data, import_file)

When that was done I put it away for a while as I wasn’t feeling well and eventually came back to do replies. I, again, manually went through all replies I had made to comments on the old system and made a CSV file with the reply date, URL of the page, the UUID of the parent comment as it existed in the new Comentario system, the UUID of the page the parent comment is on in teh new Comentario system and the text of the reply.

Two things are important to note about this:

  1. It was a pain in the hole. If I had done replies at the same time as the rest of the comments I could have used the UUIDs that I was generating in the script rather than going to find them manually and making them into a CSV.
  2. The initial upload failed as apparently Comentario couldn’t match the page and user IDs to what was in the database and it needed those to be in the import file. I got around this by doing another export and copying the entries for pages and commenters from that into the new one and uploading. This was not a good way to do this! It could have gone badly or had unexpected side effects. Again, if you’re doing this do not import comments and replies as two separate steps!
  3. It still didn’t fully work anyway. My replies did import and do show up on the right pages but they are not nested properly as replies. It’s like looking at a comment section on a very old Youtube video where reply chains are broken and everything just displays as individual comments. I don’t think that I am going to bother trying to fix this as I don’t have that many comments on this site and I think everything reads understandably as it is but if you want to try this approach you will want to figure out a way of not fucking up importing the replies.
import csv
import json
from datetime import datetime, timezone
from dateutil.parser import parse
from pprint import pprint
from uuid import uuid4



now = datetime.now()
site_url = 'https://oakreef.ie'
date_format = "%Y-%m-%dT%H:%M:%SZ"

my_id = "ADMIN USER UUID"

data = {
  "version": 3,
  "comments": [],
}

with open('replies.csv', newline='') as csv_file:
		csv_reader = csv.reader(csv_file, delimiter=',', quotechar='"')
		for row in csv_reader:
				date, url, parent_id, page_id, text = row
				date = parse(date)

				comment_id = str(uuid4())

				data['comments'].append({
					"authorCountry": "IE",
					"createdTime": date.strftime(date_format),
					"deletedTime": "0001-01-01T00:00:00.000Z",
					"editedTime": "0001-01-01T00:00:00.000Z",
					"html": f"\u003cp\u003e{text}\u003c/p\u003e\n",
					"id": comment_id,
					"isApproved": True,
					"isDeleted": False,
					"isPending": False,
					"isSticky": False,
					"markdown": text,
					"moderatedTime": date.strftime(date_format),
					"pageId": page_id,
					"parentId": parent_id,
					"score": 0,
					"url": f'{site_url}{url}#comentario-{comment_id}',
					"userCreated": my_id,
					"userModerated": my_id
				})



with open('reply-import.json', 'w') as import_file:
	json.dump(data, import_file)

My avatar

One last thing is that Comentario doesn’t allow GIF avatars, but I like my sparkly Jupiter. After looking at the Postgres database I could see that user avatars are simply stored as binary data in the table cm_user_avatars with three sizes avatar_l, avatar_m and avatar_s corresponding to 128×128, 32×32 and 16×16 pixels, respectively, so I made some GIFs in the appropriate sizes, converted them to binary strings, and overrode the avatar_l and avatar_m entries in the cm_user_avatars table manually (I left the avatar_s as a JPEG).

UPDATE cm_user_avatars SET avatar_m = '\xBINARY_DATA_HERE'  WHERE user_id = 'UUID_HERE';

This seems to work without any problems and my avatar in my own comments section is sparkly now.

Conclusions

That’s it I hope I don’t have to worry too much about this setup again for some time.


Caoimhe

New comments section with Comentario

I have finally set up a replacement for Cusdis. Following Damien’s example I have set up a self-hosted instance of Comentario.

You can comment with or without setting up an account. If you create an account please don’t forget your password because I do not have an email account set up for it to send out password resets but also please don’t reuse a password because you should not trust me with that.

I will try to transfer old comments from Cusdis over but that won’t happen immediately.

I have also set up a page that has all my bog posts without the stuff syndicated from other sites mirroring the existing Atom feed that does that.




Caoimhe

Cusdis problems

Cusdis appears to not be refreshing my monthly comment allowance so I am not able to approve any new comments. I reported this issue a week ago but I think that the developer is not currently working on the project. I may look into getting up a self-hosted version set up and migrating all existing comments to it but I am not sure when I’ll be able to get that done.


Caoimhe

If don’t want to follow my posts but not see the movie reviews, etc. here’s a new feed for that

I made some updates to the site yesterday, including a smaller feed at /beag.atom1 that only includes posts I write for this site itself, not the ones copied from my Letterboxd, Serializd, Backloggd or Fediverse accounts or things that I repost. Update: It will still include reposts.

I also added some art to the Transy page by Kate Barrett that I had forgotten to.

Otherwise it was mostly some layout and styling tweaks and fixes. Text in dark mode should be a bit brighter now, there’s custom text selection colours and on the homepage there’s one new 88×31 pixel button and an infobox telling you to install an adblocker if you don’t have one.

  1. Beag is Irish for “small”. ↩


Caoimhe

What I’m reading vol. Ⅳ

Vols.: Ⅰ, Ⅱ, Ⅲ, Ⅳ, Ⅴ, Ⅵ, Ⅶ, Ⅷ, Ⅸ, Ⅹ, Ⅺ, Ⅻ, ⅩⅢ, ⅩⅣ, ⅩⅤ, ⅩⅤⅠ

Doing another one of these. I still intend on doing rebogs as well and I’ve added some more styling to make reposts stand out from my own words and make a more clear divide between them.

History and science fiction

On Bread and Circuses — Bret C. Devereaux

Devereaux digs into the origin of the phrase “bread and circuses”.

So the surface reading seems clear: he is putting the Roman people on blast for letting their authority over public affairs be taken away, usurped by emperors who promise them bread and circuses (we’ll come to if this is an accurate representation of the history in a moment). They used to have all of this power, the power to bestow offices and armies, but now they cower fecklessly in the wake of imperial slaughter and arbitrary rule.

Except, of course – wait a minute – isn’t the theme of this passage that power is an unwise thing to ask for? The theme of the whole poem is that you shouldn’t be asking the gods for these sorts of things!

The Problem with Sci-Fi Body Armor — Bret C. Devereaux

Also from Devereaux.

Instead, where real armors evolve against threats, fictional armors evolve as a visual language, borrowing the design elements of other fictional armors far more often than they dip into their own historical exemplars, with the result that the whole thing sort of devours itself.

Fiction referencing exclusively other works for fiction rather than looking to the world is something I think about as well from time to time.

Book Review: War with the Newts — Nathan Goldwag

Goldwag reviews a book from the man who coined the word “robot”.

The novel starts with Captain van Toch, a Czech sea-captain in the service of a Dutch trading company, stumbling upon an isolated community of giant amphibians in the Dutch East Indies, living on a single tiny island, their numbers culled constantly by sharks. Van Toch realizes that they’re trainable, and extremely intelligent, and has the idea to plant colonies of them across the Pacific to work as pearl divers. After his death, the Pacific Export Company transitions from luxury goods to mass labor, selling newts across the world as an undersea work force capable of hydraulic and maritime engineering, which results in Newts settling most of the world’s coastlines and becoming an integral part of the global economy. “So now we find the salamanders on the road to their finest flowering; but the human world, too, is enjoying unprecedented prosperity. New continental coasts are being feverishly constructed, new dry land is emerging from where shallows used to be; artificial air support islands are springing up in the middle of the ocean.” (Newts, pg. 165). For all the absurdity, however, Čapek treats his topic seriously. We’re given footnotes, citations, discussions of legal dilemmas and cultural disputes, discourse on the economic impact of newt labor and how it affected different nations and groups, taxonomies on newt evolution and biology. It doesn’t feel like a cheap trick or a gimmick because it’s all done with such care.

Gender

Degendering and Regendering — Talia Bhatt

In short, to acknowledge transmasculinity, a society would have to first admit that manhood—just like womanhood—is a social class and not a 'natural' category. Its people would have to acknowledge that the desire for independence and self-actualization exists within all of us and is not, in fact, stored in the balls.

My Doctor Emailed Me Back — Abigail Thorn in Trans Writes

Thorn outlines very well the fundamental ideological problems in the NHS and how trans healthcare is handled that I think apply very well to the HSE here in Ireland as well.

There are even more serious charges. The coroners’ reports into the deaths of Sophie Williams and Alice Litman said lack of gender affirming care contributed to their deaths. That is to say, it is a matter of publicly recorded fact that the NHS’ failure to provide gender affirming care has contributed to the deaths of patients. Nobody at NHS England has resigned or faced consequences.

Of course panic, misinformation, and mistrust take hold in these conditions! Of course people come to believe the NHS are making secret plots behind closed doors! These conditions are entirely of the NHS’ own making. Slapping a famous trans person’s face on a new outreach program does nothing to address them. As I told Colonel Korn, if the NHS wants to increase trust they should start by apologising.

But the Colonel expressed his bind to me the same way every other NHS senior official I’ve spoken to has. The Department of Health and Social Care tells the NHS how they have to spend their money. The mandate they get from the Health Secretary tells them what services they have to commission: if it says “Ten more transplant wards,” they need ten more transplant wards, and that’s that. If it says “Spend £90m pathologizing trans people,” that’s what he has to do.

This point bears underlining: every single person I have spoken to in the NHS- from local GPs to the National bosses- told me they are powerless. There is nobody at any level of the organisation who takes responsibility for the state the service is in and the suffering it is causing. Every single person blames the person above them, even the man at the top.

Technology

Hitachi Hacking, part two! — Kore

Followup from the first of these posts.

In my last post, I succesfully made a bluetooth/wifi Magic Wand Plus. Unfortunately, though, I completely bypassed the original Hitachi board, which happens to be where all the buttons and LEDs are attached, so it was only usable remotely. To make the physical controls work again, I could either make my own copy of the Hitachi's board, with buttons and LEDs in the same places, or somehow reprogram the original board and make it do my bidding.

The first option requires a lot of measuring, which I find really annoying to do. So, let's hack the Hitachi's microcontroller!

React, Electron, and LLMs have a common purpose: the labour arbitrage theory of dev tool popularity — Baldur Bjarnason

I love economic forces.

MongoDB’s popularity among managers during its peak was largely down to the idea that you no longer needed a database expert. Just throw the data into the document DB puddle and let your existing less-specialised developers handle it. The promise of the document database during the peak of their hype was that you didn’t need to employ as many specialists.

Electron, PhoneGap, and React Native promised to let companies replace their expensive platform specialists with more commodified generalists.

Standardisation in web development lowers costs, increases predictability, and makes the various browsers more interchangeable. It’s a hedge that reduces the individual market power of each browser, but usually in equal degree while increasing the value of the overall web, leaving each browser vendor better off as a result. Their market share might not increase but they have a bigger cut of a larger pie. Incompatibility tends to drive developers and companies to other platforms, reducing the overall pie.

Standardisation of labour, conversely, does not benefit labour.

Open source maintainers are drowning in junk bug reports written by AI — Thomas Claburn in The Register

Everybody hates A.I! Here’s another reason to.

Whatever happens to Python or pip is likely to eventually happen to more projects or more frequently. I am concerned mostly about maintainers that are handling this in isolation. If they don't know that AI-generated reports are commonplace, they might not be able to recognize what's happening before wasting tons of time on a false report. Wasting precious volunteer time doing something you don't love and in the end for nothing is the surest way to burn out maintainers or drive them away from security work.

Seth Larson

Palette swaps — Mabbees

Seeing as I dusted off Pico-8 again recently here’s a little post about doing palette swaps in it.

The concept of a palette swap is drawing something with a different set of colors. It’s a good way to get more mileage out of your PICO-8 sprites. There are a bunch of things you can do with palette swapping

  • create variations on a character
  • make simple looping animations
  • fade in or out of a scene
  • simulate day/night cycles

But what does this mean for us as programmers? How do we represent the concept in code?

Scrapers I block (and allow), with explanations — Seirdy

Technical website bullshit, but something I’ve been meaning to look at setting up for this site too.

Bots I block fall into one of the following categories:

  • Bots that only serve to power adtech on other sites. My site has no ads, but I allow bots such as Google’s AdsBot.
  • Intellectual property snitches. I forbid robots that scan for plagiarism, trademark/copyright violations, brand protection, etc.
  • Robots that power invasive background checks that border on cyberstalking.
  • Scrapers that build datasets to train Generative AI (GenAI), such as large language models (LLMs). I don’t block search clients used by GenAI research assistants; I only block scrapers used to train GenAI models.

Everything else

Saying Gaelic / Gaeilic is ok

I used to be one of the people who “corrected” people about the word Gaelic. I am sorry.

The Irish Language was referred to as both Gaelic and Irish until the Republic was formed. “Irish” was mainly used by academics; “Gaelic” was used by the common people.

The Republic chose “Irish” over “Gaelic” for political/nationalistic reasons.

Pornhub Sees Surge of Interest in Tradwife Content, ‘Modesty,’ and Mindfulness — Samantha Cole in 404 Media

Dahl started an Instagram account in 2023 that parodied tradwife content creators, after her own account was banned by the platform multiple times. Tradwife content (short for “traditional wife) is fetish content, even if the “wife” isn’t showing skin. It’s a fantasy, and always has been, even when it was used to sell ovens to 1960s homemakers.

Laziness Does Not Exist — Devon Price

Kim is the person who taught me that judging a homeless person for wanting to buy alcohol or cigarettes is utter folly. When you’re homeless, the nights are cold, the world is unfriendly, and everything is painfully uncomfortable. Whether you’re sleeping under a bridge, in a tent, or at a shelter, it’s hard to rest easy. You are likely to have injuries or chronic conditions that bother you persistently, and little access to medical care to deal with it. You probably don’t have much healthy food.

In that chronically uncomfortable, over-stimulating context, needing a drink or some cigarettes makes fucking sense. As Kim explained to me, if you’re laying out in the freezing cold, drinking some alcohol may be the only way to warm up and get to sleep. If you’re under-nourished, a few smokes may be the only thing that kills the hunger pangs. And if you’re dealing with all this while also fighting an addiction, then yes, sometimes you just need to score whatever will make the withdrawal symptoms go away, so you can survive.

Playing Both Sides — Mike Egan

A cute story about Star Wars: Battlefront.

But it wasn't just that it was super difficult and took a long time. The hilarious part of all of this is that the fact that there was still a battle going on outside meant that the number one reason we didn't get to destroy the shield bunker was that the match had ended. The AI armies we were ignoring went on fighting their war and reached a conclusion before we were able to deal enough damage to the damn thing.




Caoimhe

Rebogs

I’ve been testing how I want to handle rebogs on this site.

The previous post was rebogged entirely manually. I wrote a post in the normal format for Jekyll and defined metadata for the rebog information to link back to Freja’s website and display her avatar. Now I have to figure out how I want to streamline that process.

For posts syndicated from Letterboxd and such I have a setup where when I build the site there’s some code that checks those feeds and processes them into their own special folders that then get processed and added into the list of posts.

For rebogs though I think I’m going to do it differently and write a script, probably in Python, that I can run from my command line and give a link to a post that will attempt to parse the content of it then write it to a file directly into the same folder as my normal posts but with the extra metadata I’ve defined for for rebogs.


Caoimhe

Webmentions

Continuing to crib from Natalie I have finally gotten around to trying out webmentions for this site.

I had bookmarked her posts on it and made notes and was going to get around to implementing it myself when I thought “hey I’m using Jekyll has a webmentions plugin already been made for Jekyll?” and the answer was of course it had. Adding it was very straightforward and hopefully it works out of the box.


Caoimhe

Removing other Atom feeds

The previous version of this site was originally just the gallery and it included an Atom feed honestly mostly just because I wanted to understand better how RSS worked and it was an interesting and fun thing to make. When I made the bog instead of retiring the old feeds I added a new one and then made a combined one that had everything and as I’ve reorganised things this has become a pain.

And the gallery is a record of past things I’ve worked on. The dates listed are retroactive. Even when I add new things they’re usually pretty heavily back-dated. It’s not really an appropriate use of an RSS feed. You shouldn’t really be adding things that have dates months or even years in the past. And when I add something there now I’m probably going to have a post about it anyway. So I’ve decided to simplify things. I am going to remove the other feeds and redirect them to the one for the bog. If I add something to the gallery there’ll be a post about it and obviously the two podcasts have their own feeds. Because they’re podcasts and that’s how podcasts work.


Caoimhe

I finally added h-entry markup to the bog

I bookmarked a couple of posts from Natalie ages ago about h-entry and have finally gotten around to marking up my posts with them.

Hopefully I didn’t mess anything up and everything parsable now. I should have done this sooner as it was fairly simple but better late than never.

Now I have that set up as well as syndicating posts from my Backloggd and Letterboxd feeds. Next steps in trying to get set up to be part of the sociable web: Webmentions and figuring out how I want to handle rebogging individual posts.



Caoimhe

CSS is fun!

This post demonstrates custom CSS that won’t display in RSS readers.

One of the things that Cohost taught me is that CSS is actually fun. Styling a website is a really lovely form of self-expression and I have been really enjoying styling this this website1. And I thought I’d highlight some of the things I’ve done.

Colours

The site has two different colour schemes for dark mode and light mode. I much prefer the dark mode one but I generally use dark mode for everything I can. The dark mode has a cool, blue palette while the light mode uses a warmer colour scheme with oranges and peach colours. Most of the colours I used are picked from the Pico-8 palette.

There is a gradient as you scroll down the page in both colour schemes ending in a different footer images2. In dark mode stars also come out as you scroll down.

External links and internal links have different colours3 and also some links have special decorations. If I link to the atom feed for the bog or my page about Snolf they have little Nintendo dialogue icons appended to them or if I link to Transy it uses the typeface that she talks in: Hobo.

This applies whenever those specific things are linked to and I don’t need to do anything special with this post to apply them.

Cursors

The site also has custom cursors based off of old Windows cursors. If you mouse over the above links you might have noticed that there are also different cursors depending on what type of link they are.

Fonts

For the Irish language portions of my site I use Mínchló GC from Gaelchlo instead of Crimson Text which is used for English text. I also use it for the title of The Bog because using silly fancy text for headings is fun. Other examples: Gallery is Tate Regular, The the Ring Podcast uses Some Rings and a bunch of other fonts I use for titles on my homepage are references to Sonic the Hedgehog because of course they are.

Buttons!

The most important part of any site is 88×31 pixel buttons, obviously, to which I have a crippling addiction. I’ve copied some CSS from Hyphinett to embiggen them when you mouseover them and also set rendering mode to pixellated to keep them nice and crispy.

oakreef.ie

If you have your browser set to prefer reduced motion the mouseover effect is disabled and all the animated buttons are replaced with static ones.

For sites that don’t have buttons I use a little 88×31 image of a little piece of paper that I tore up with the names rendered on top slightly askew in Cinema Calligraphy.

Layout

The homepage divides into multiple columns depending on the screen width. Other pages generally have a single-column layout with navigation elements on either side that collapse to the top of the page if the screen is narrow enough, like on mobile. The avatar for the bog also snaps to the top on narrow screens and otherwise sits beside posts and scrolls with the page.

Gallery pages have sets of links next to/under the title that all change to the site’s link hover colour when mouseovered. This applies is applied to images using a combination of -webkit-filter sepia and hue-rotate. This also changes with light and dark mode. Projects with git repos have an icon here that expands into an info box with the git repo address.

And sometimes I just do little bespoke things for pages, such as the vertical Ogham text on the Cló Piocó-8 page. Trivia: Ogham is one of the few scripts that is written bottom-to-top.

Printing

I also have some custom CSS for printing. I don’t really plan on printing pages from this site nor do I expect anyone else to, but it was fun to play with. Colour is drained out of styling to save on coloured ink, links are instead underlined and the addresses they point to appended after them in brackets. Videos and audio players are hidden, the link icons in gallery pages are turned into a bullet point list under the header and the comment box is hidden.

When there’s no CSS

Printing is just one alternative way I like to think about how my site could be displayed. While I don’t test the site with Netscape Navigator4, I do read back over posts in my RSS reader and sometimes check the site in the terminal-based web browser Lynx.

Again I don’t really expect people to be navigating this site in the terminal but it does make me mindful of how the site functions in terms of pure HTML content elements without the fancy styling and I think it’s important to keep it understandable and navigable in that mode too. That is how the site is going to be parsed by accessibility tools. I also try to have as little Javascript involved as possible as well and not use it to render page content5.

At the top of this post there is a little infobox warning. There is CSS to make this eye-catching but it’s also defined as an <b> element so that even in the absence of CSS it will display bold and be a little attention-grabbing.

On gallery pages, and especially on podcast episode pages, there is a credits/links section at the bottom of the page in smaller text. There is a heading about this section saying “Credits” but it’s hidden by CSS as I thought the page flowed better without it. It’s still there for if the page is being read without CSS and the styling can’t be used to differentiate it as a separate element from the main page text as clearly.

I used to some invisible horizontal rules across the page, set to not display using CSS, that would divide the header and footer of the site from the main content to try and make it read cleaner in situations where there was no CSS. That was before I simplified the site layout somewhat and took out the more divided header and footer areas with links in them that the site used to have.

Conclusion

That’s all that I can think of off the top of my head. Bye.

  1. When it is not making me tear my hair out at least. ↩

  2. Both footers are modified Sonic the Hedgehog backgrounds. ↩

  3. Green and blue in dark mode, brown and orange in light mode. ↩

  4. Sorry, Luna. ↩

  5. Other than comments and webring stuff on the homepage. ↩


concept: rewrite a bunch of my website code to split out sections from each other more cleanly so I can more easily make small posts with less effort

result: oh god oh fuck everything is broken and I have way to many unstaged changes what was I in the middle of doing a week ago before I went on holiday if I want to post anything I need to stash fifty files and change branches which takes several minutes right now

Though honestly that describes the situation more a week ago than right now. I do have the podcast processing stuff finished now and I just need to do similar rewrites with the Pico-8 processing. That should🤞🏻 be easier now that I have done the podcast stuff and can base what I do on how I handled that.


Caoimhe

Comments

I am trialling a comments section using Cusdis. There should be a comment section below this and every other bog post as well as every entry in the gallery.

This means most pages on here now use Javascript which makes me a little sad but maybe it is worth it.

Or maybe I will just decide to remove this again! We’ll see.

In any case feel free to say hello in a comment below.


Caoimhe

How my bog handles images

A different GIF will displayed below depending on your browser’s prefers-reduced-motion and prefers-color-scheme settings. There’s four different possibilities:

A white cat

I hadn’t used prefers-reduced-motion before but I saw a chost from Kore linking to a blog post about accessibility and GIFs and decided I wanted to follow it but I also didn’t want to have to manually write the HTML code for it each time. Thankfully programming is the art of being tactically lazy and I can put some effort in up front and solve an interesting problem once and then let my site generator handle it automatically from then on.

Also thankfully I had done something like this before after taking inspiration how Luna’s blog handles images. I don’t have high DPI images but I do have different dark and light mode versions of images for the The “the Ring” Podcast series tracker chart and the Dracula International diagram I made.

The way I had initially done that was, characteristically, a mess. I wrote a custom custom Liquid tag to handle it which meant that instead of actually using the existing, basic Markdown syntax I had to put images into my posts with something like this:

{% image /bog/images/easóg.gif %}

So revisiting this to include prefers-reduced-motion options I decided to do it differently this time. A way that would allow me to just type the normal Markdown syntax and let my code handle everything else.

![A white cat](/bog/images/easóg.gif "Easóg")

The next step was to look into how to extend and customise Jekyll’s Markdown parsing and output but that sounds hard and I didn’t want to do that so I just used a regular expression1:

/((!!?)\[([^\[\]]*)\]\((.*?) *("([^"]*)")?\))/

This runs against the raw Markdown before it’s parsed into HTML and pulls out the link, alt text and title. That last part is also a big improvement over the custom tag I previously made as that didn’t support alt text or titles at all.

The code then takes the link and checks if there are any alternative versions listed in the site’s static file list like easóg.dark.gif, easóg.static.gif or easóg.dark.static.gif. when writing a new post now I don’t have to do anything extra other than have those other versions with the right naming scheme in the same folder as the original image.

From there it it compiles it into HTML and replaces the original Markdown in the document:

<picture>
  <source srcset="/bog/images/easóg.dark.gif" media="(prefers-color-scheme: dark) and (prefers-reduced-motion: no-preference)" />
  <source srcset="/bog/images/easóg.gif" media="(prefers-reduced-motion: no-preference)" />
  <source srcset="/bog/images/easóg.dark.static.gif" media="(prefers-color-scheme: dark)" />
  <img src="/bog/images/easóg.static.gif" alt="A white cat" title="Easóg" loading="lazy" />
</picture>

Well, actually it does something else too. You might have noticed in the regular expression up above I am actually checking for an optional, second exclamation mark at the start of the image tag. That’s my own extension of the syntax. If I’m doing my own parsing I might as well go wild with it. If there are two exclamation marks at the start of the tag it also wraps the image in a link to itself and adds an extra class:

<a href="/bog/images/easóg.static.gif" class="dynamic-image-link">
  <picture>
    <source srcset="/bog/images/easóg.dark.gif" media="(prefers-color-scheme: dark) and (prefers-reduced-motion: no-preference)" />
    <source srcset="/bog/images/easóg.gif" media="(prefers-reduced-motion: no-preference)" />
    <source srcset="/bog/images/easóg.dark.static.gif" media="(prefers-color-scheme: dark)" />
    <img src="/bog/images/easóg.static.gif" alt="A white cat" title="Easóg" loading="lazy" />
  </picture>
</a>

The classes are to enable a little bit of Javascript2 to swap out the destinations of the links on the fly when swapping if the user’s media preferences change. Whichever one you currently see in the browser is the one you’ll go to if you click on it.

I might review the double bang syntax if I can figure out something that could be added to the tag that would get stripped out and ignored by a normal Markdown parser for better compatibility. If only Markdown had comments.

Is this a robust solution? Absolutely not! Will I eventually run into annoying weird cases that make me bang my head against the wall as a result of this? I already have! While writing this very bog post! Because the regular expression cannot tell that the markdown code example I have above is not meant to be parsed and turned it into HTML, making it impossible to show the before part of the before and after. Did this make me go back and implement this in a better way? No!

I added some metadata to this post telling it do disable my custom image parsing, made the parser skip doing anything if it finds that metadata on a page and then hardcoded the example at the top of this page. That’s right: This post isn’t actually using the one thing it’s meant to be demonstrating!

  1. I could have also tried parsing the resulting HTML instead of the Markdown like Luna did but that also seemed like it would take slightly more effort. ↩

  2. One of only three four a sadly increasing number of things Javascript is used for on the site. ↩