+++*

Symbolic Forest

A homage to loading screens.

Blog : Posts from February 2026

Possibly the worst cryptid sighting ever

A cryptid, at a distance, whilst zooming along a motorway

Ever since I was a wee girl, I loved Forteana. Tales of the unexplained. Creepy stories, earth mysteries, that sort of thing.

Most of them were remote, in relatively exotic places like Bermuda, the Harz mountains, or New Jersey. There were a few, though, that were a lot more local. Crop circles, even if they didn’t tend to pop up much in The North. The Loch Ness Monster, even further away. And alien big cats.

The classic alien big cat from that time period was the Beast of Bodmin, but they popped up all over the country. The Beast of Exmoor wasn’t too far from Bodmin, but they’ve popped up further and further north over the years. There was a spate of sighting in Lincolnshire in the nineties, for example. I always kept a lookout, but I never saw one.

Until, towards the back end of 2024.

They weren’t on my mind at all, that day. I was zooming south down the A1, just past Peterborough, just coming up to the Huntingdon exit, when I saw it. About here.

On the right, was a landscape of rolling hills leading up away from the road, arable fields, with woodland to either side. In the nearer field was a large, black animal. Too dark to be a stag. I thought at first, it must be a cow, but then realised that it was the wrong shape. It was moving, away from me, and it was stalking. Keeping itself low, its shoulders moving stealthily.

It was a big cat. Like nearly all British big cat sightings, it was a black one.

I would have left it at that—I had other things on my mind that day. But the next day I thought to search for other sightings; and a few of weeks earlier, another had been spotted only about twenty miles to the north, around the area where Lincolnshire starts to fade into Cambridgeshire.

I only had it in sight for a couple of seconds, to be fair. I could have misjudged the distance or the scale. No big cats have ever been reported as roadkill in Britain. But if there really aren’t any here, then many, many other people in Britain have made the same mistake as me over the past fifty years; and in one case now, genetic evidence of a big cat has been found. I’ve never seen a feral wallaby either, but nobody doubts that they exist in Britain.

More than that, though, I want to have seen it. They’ve been in the back of my mind since I was small, after all. Now—for over a year, even—I can genuinely tell people I’ve seen one.

The impermanent way

In which we build a train set on the dining table

A few weeks ago, I posted about how I’d finally made the decision to start building a model railway, because perfection is the enemy of the possible or something along those lines.

A few days later, a box arrived.

A big cardboard box, sitting on the carpet

No, I don’t know why they sent such a big box, because the contents were much, much smaller.

If you want to model the Brecon & Merthyr Railway in the 1950s, Great Western pannier tank locos were extremely common. Conveniently, at the moment, you can easily buy an N Gauge train set containing a Great Western pannier tank, a couple of wagons, and a brake van to go on the back. Buying a set, with an oval of track and a power unit, means you bootstrap yourself: you can get everything you need to run one train in one box, even if all you can do is send one single train round and round in a circle. I’ll do a post explaining what “N Gauge” means at some point.

A tiny model of a Great Western Railway steam engine, pulling some wagons, on top of a dining table

Some people might point out that the loco is in 1945-47 condition, but the wagons are in pre-1937 condition; lots of wagons never got repainted though, so really they just need to look a bit dirtier and worn-looking than they are. You might notice I’ve also bought myself a few more wagons, the well known “BR 16 ton” type. Over 200,000 of them were built in the 1950s, and they were ubiquitous on the railways from the mid-50s through to the early 1980s. The ones I bought come in pre-rusted condition from the factory, so they’re really more like a wagon of the 1970s, after the B&M had closed; but, regardless, they’re still appropriate for the train.

Ever since I was small, also, I’ve read model railway advice that says “never run your train set on the carpet! There’s too much fluff!” So, this is on our dining table, which is also nice and friendly on my knees. I deserve comfort, you know.

Naturally, I wasn’t satisfied with just a single circle of track. It wasn’t long before another box arrived.

Pieces of model train track, in packaging, inside a freshly-opened cardboard box with brown paper padding

The track is a different brand to the train set, but it’s all the same track gauge, and also, all the track is the same shape: the curves are the same radius, the straight bits are all the same length. You’d think it would all just slot together, wouldn’t you?

Well, it didn’t.

Although the track was all compatible on paper, the “rail joiners” on the train set track were bigger and chunkier than the ones on the extra track. The extra track didn’t have enough clearance, between the rails and the plastic base, for the joiner on the train set track to slide on.

If this was a proper model railway and all of the track was fastened down, I wouldn’t care about this. I’d just pull all the joiners off and replace them with thinner ones. Because this is still just a train set, which has to be taken apart again whenever we want to stop playing trains and play a board game instead, that wasn’t really an option. Option two was to replace all the joiners anyway, and just hope that the new joiners stay in place. It would have done the job, but it also sounded like a lot of effort. Option three: buy more track. The original oval of train set track went in the spares box, and I just bought myself an oval from the other brand instead.

With that done, though, we had something you could imagine was a little station. It’s not much station and you need a lot of imagination, but nonetheless, you can shunt your train about!

A model railway on a table, with a loop and a siding.  The train is passing through the loop, and there are a few wagons in the siding

(This is a still from a video, so it’s a slightly blurry photo. Never mind that)

Where do we go from here? Well, there’s a few more things a full railway will need. More than one train, for one thing. I’ll post about that soon. For now though: there’s something extremely fun and simple about just being able to run your train round in a circle on the dining table, without really worrying about accuracy, authenticity, and anything else. Until we do need the dining table for something else.

Forging ahead

Or, how Cait ended up building her own tool to build the site

When I last wrote an article about how this blog is built, how it is turned from Markdown text into an array of thousands of static HTML pages, over eighteen months ago now, I said that “another big change to how the site is published” was coming soon. It did, indeed, come soon; I just didn’t write about it. Since summer 2024, this site has been published by an entirely new static site generator. Moreover, it’s my static site generator.

When, in 2020, I decided to switch the site from hosted Wordpress to being static, there were a few options to choose from. Jekyll is (and was) one of the leaders, but it’s written in Ruby, which would have been a whole new ecosystem for me. Eleventy seemed like a good option, and I can’t really remember why I didn’t choose it at the time. The tool I eventually went with was Wintersmith, because it seemed simple and straightforward, and a quick proof-of-concept showed that it had all the features I needed. The only red flag, though, was that it didn’t seem to have been updated very recently. Nevertheless, I thought, I could always move again later.

I reimplemented the site with Wintersmith, got everything working, and built new Wintersmith plugins to provide all the features that Wordpress had, like tagging and categories. And all was good. Except, Wintersmith still wasn’t getting updates.

Wintersmith was part of the JavaScript ecosystem, distributed via NPM. Every time I ran a build, NPM would warn me that a big stack of Wintersmith’s dependencies were outdated and had security risks. None that genuinely affected me; but still, it was more and more of a concern. I thought: well, I could patch it; but then, I saw, someone else had already submitted a patch to do just that, and the patch was sitting there in the project repository, unmerged. I had to switch.

Rather than learn a new system, though, why not take Wintersmith and fork it? It’s open-source software, after all. A fork is simply when someone takes an existing project which doesn’t quite do what they want, or which is going in a direction they don’t like; and they make it their own. Like two different branches of the evolutionary tree; things split off in different ways, and we end up with mammals and lizards and birds all happily coexisting.

So, I picked a name—Iceforge, to give it a nod to its heritage—and got started. And along the way, I changed a lot. Iceforge is a classic Ship of Theseus. Every single line of code is changed, but it will still build a basic Wintersmith site, and plugins only need slight changes to port them from Wintersmith to Iceforge.

The reason I can guarantee every single line of code in the application has changed—aside from possibly some of the blank ones—is that Wintersmith was written in CoffeeScript. You might not have heard of CoffeeScript; I had used it, in the early 2010s. It is essentially an alternative syntax for JavaScript. It’s a much terser syntax; it’s heavily whitespace-dependent, and at the time it was created it included a few features JavaScript didn’t have, like classes.

I didn’t like using CoffeeScript, although I understood it well enough to write my own Wintersmith plugins; so I immediately knew that Iceforge would use something else. The obvious choice was TypeScript: a more verbose version of JavaScript, more verbose because it includes compile-time type checking.

Naturally, I had to switch over from using CoffeeScript classes to JavaScript classes; that wasn’t an issue at all. The asynchronous coding style also, I thought, could do with an update to it. “Asynchronous coding” means that, when the application goes and asks the computer to do something that might take a while, like reading a file, it will get on with something else whilst it’s waiting until the file is ready. When I’m cooking food I’ll pop it in the oven, and then I’ll go take the rubbish out whilst it’s roasting. Asynchronous coding is just like that, but not as tasty.

Originally, Node.JS handled asynchronous coding through something called continuation-passing. It relies on the fact that functions, individual pieces of code, can be passed to other functions which can then call them. With continuation-passing style, if you want to read a file, you call a system function and give it first the filename, and then the piece of code to call when the file has been read. It worked well given the limits of JavaScript at the time, but it means that code can end up a little bit broken up and fragmentary. The code that gets run after a “slow operation” has to be separate from the code that gets run before a slow operation. Moreover, Wintersmith was largely plugin-based, and continuation-passing clutters up the plugin API. Every Wintersmith plugin has to be written in a continuation-passing style and the plugin authors have to remember to call their continuation functions even if the plugin itself isn’t calling any slow operations.

From 2015, JavaScript gained an awful lot of new features; one of them was “promises”, a new way of calling slow operations without passing continuation functions. A couple of years later, it gained the await keyword to go with them. A slow function, nowadays, can return a Promise object, and the developer can choose whether to treat that in a continuation-passing style, or to use await to pause that particular line of execution until the result from the slow operation is ready. Because, in my opinion, that produces much more readable code, I restructured all of Iceforge to use awaited Promises everywhere that the code had been using continuation-passing. When a developer is writing an Iceforge plugin, their plugin registration function has to return a Promise, but they don’t have to worry about adding a continuation boilerplate call any more.

I made various other useful changes, such as building into Iceforge’s “blog” site template a lot of the features I’d developed for this site. The Markdown parser had to be tweaked a bit, just because the API of the underlying Markdown rendering library has changed a bit. I developed a unit test suite, not something Wintersmith has ever has as far as I’m aware. The one thing I haven’t done yet is documentation. At present, all I’ve done is to add documentation to the code itself; learning how to use Iceforge is left as an exercise for the developer. At some point, when I find the time to write all that, I’ll get a documentation site online. After that there are a few other things I’d like to do, such as port over the rest of the existing Wintersmith plugins, and implement footnote support in the basic Markdown plugin. After that… Iceforge 2.x could do with a much bigger rewrite, to tidy up aspects of the API that I’ve just found a bit weird. There’s no rush, though.

If you want to use Iceforge you can install it from NPM, either as a global tool, or if you’re willing to consider your website source code to be an NPM module, locally within that module. I like the latter, because it works cleanly with CI/CD toolchains, but you could do it the other way too. This blog post isn’t meant to be Iceforge documentation, so I’ll let you play with it yourself, but feel free to try it out and give it a go. I will get the documentation site finished some day, I promise.

Theory and practice

In which Cait once more attempts something she's always wanted

Occasionally, over the past few years, I’ve mentioned how I’d like a model railway, but there are just too many interesting railways to choose from. In fact, I’ve always wanted a model railway. My father also always wanted a model railway, but never quite managed to do anything about it either.

This has led me to an interesting place in life. I’ve always had many, many plans for different model railways. I’ve tried to start building them, and I’ve never got very far, but the research I’ve done has been immense. On the actual railway history side, I know my stuff. I know my Bristol & Exeter from my Bristol & Gloucester. I know my Midland from my Great Northern from my Midland & Great Northern. I know why the Great Western Railway had LNER-style signals, and I know where the LNER ran in North Wales and why. On the modelling side, I know my theory too. I know why cassettes are better than traversers, and the difference between EM and P4. I know who Edward Beal was, and how his West Midland Railway wasn’t the real one. I know John Ahern created the Madder Valley, that Barry Norman doesn’t mean the film critic, and that Cyril Freezer has had his day. I know that dyed sawdust is a thing of a past, and I’ve admired Copenhagen Fields. I know the theory. I’m just no good at putting it into practice.

Like any skill, though, this is a classic chicken and egg situation. I’m just no good at putting it into practice, because I don’t try.

The answer to that, of course, is to just pick something and start. And nowadays, model railways have come on a long way from where they were when I was a small girl. There’s so much more that is either available to buy off the shelf, or has been at some point and can be found on the second-hand market. You just have to be judicious what you choose to build. If you want to model something from after 1950 or so, it’s much easier than something before around 1925, just because the amount of diversity in the railway network dropped dramatically following the creation of British Railways and the National Coal Board.

That means that building a model of, say, the Brecon & Merthyr Railway in 1905, would be difficult for a practical beginner, even though it would be incredibly interesting and different to most of the model railways out there. A model of the Brecon & Merthyr fifty years later, though, would be relatively straightforward. A few obscure local locomotives were still around, but most were fairly common Great Western and British Railways types. All the obscure little 4-wheel coaches the line had in 1905 had been scrapped and replaced with ordinary GWR ones; all the colliery-owned coal wagons with hand-painted lettering had been replaced with plain grey British Railways 16 ton ones.

With that in mind… I’ve bought myself a treat. I’ve bought myself a regular train set with a few extra bits and pieces, so I have enough there and then to at least get something moving and give me the inspiration to build more. Let’s see where it goes from here!

Update: To see where it did go from here, read the next episode in this saga!