2026/04/22 #

Cool things about my new blogging tool

There are a lot of cool features in my new blogging tool. Here are some of the top of my head:

  1. Render anything, from individual posts to full blown websites.
  2. Integrates with the writing tools you already use today.
  3. Templates for pages but also file paths, for maximum flexibility.
  4. Automatically generate frontmatter for your markdown files.
  5. It‘s agnostic so you can use any template rendering engine.
  6. Supports partials and cross engine calling.
  7. Add functionality using toolpacks accessible from inside the templates.
  8. Blueprint based workflow engine you can use to create assets of any shape.
  9. Attach logic to templates to explode out many output files from one input template.
  10. Run javascript middleware stacks at key places in the render pipeline, integrate with anything.
  11. Transform data on the way in before it hits your templates.
  12. Extreme debugability, easily see how data flows through the render pipeline.
  13. Integrates with Github for atomic and batch review and approve based publishing workflows.
  14. Dispatch rendered assets to external destinations with custom deliveries.
  15. Easily cleanup your local workspace with custom cleaners.

There‘s a lot more too.

It‘s the fastest way to get from idea to published, completely remove all the tedium from writing online.

I‘m using it right now to write all my posts. Each one gets it‘s own git branch, automatically and uniquely named. You can bulk push all your branches to Github, and then the workflow side picks up and your content goes through a PR based workflow, each item can be review and approved, or auto-merged.

Seems to be working pretty well so far. #

Today’s links:

  • Mozilla launches Thunderbolt, an AI frontend client for self-hosted AI infrastructure, aimed at the enterprise market. arstechnica.com #

  • SpaceX in $60 billion deal with AI focussed code editor company Cursor. www.nytimes.com #

2026/04/21 #

The return of allergies

It was to be expected I suppose, no sooner than I have started writing again and the world around me is angry. Always angry about something. The world is angry I don't do what it wants. It's also angry when I actually do what it wants. It can't make up it's mind. It's really quite unbelievable, like some sort of evil clockwork. Like a heat seeking missile, you just know the moment you see it off in the distance, that no matter what you do, that it's going to get you in one way or another, eventually.

Also the allergies are back. What a surprise.

Really trying to keep upbeat about things, but that easier said than done when the world is angry and your face is on fire and leaking. #

Today’s links:

  • Tim Cake to be replaced as Apple CEO by John Ternus. www.cnbc.com #

  • levels.io just vibe coded replacements for all his browser extensions, was concerned about security, better to control the code. x.com #

2026/04/20 #

Twitter blocking my auto-poster

There were two issues getting all the gears in my blogging setup working again after a few months of not posting. Both related to the social media auto-poster Github action workflow that runs every day to post links to various social medias to new posts on the blog. Bluesky and Mastodon still worked perfectly, but Nostr and Twitter were both erroring.

I figured out the Nostr error quite quickly. Looks like some of the relays I had been using to post messages had gone offline. I updated to a more recent list of relays and posts began flowing again.

But the Twitter blockage was much more involved. I spent the morning navigating the quite complex developer portal, and regenerating an absurd amount of API keys and secrets and bearer tokens, and deleting my app and recreating it. Still authentication errors. Eventually went to the billing page and there was a note that said free tier accounts can no longer access the API.

Ok well I guess Twitter doesn't value my content much. Looks like, for the moment at least, none of my posts will be flowing through Twitter.

Kind of disapointing. #

Really really weird connectivity issues

I'm having the strangest connectivity issues all of a sudden. Some web browsers on my machine can't load any web pages at all. Others can load some pages, but not others.

Trying to troubleshoot it with the help of some LLMs but of course the connectivity issues mean it's very difficult to do anything at all because the sessions keep disconecting.

I haven't installed any software or made any configuration changes recenrtly.

Anyway just posting this in case the world is about to end or something. I hope not. #

Connectivity restored

Well after several about an hour troubleshooting, the conclusion from the LLM was that the networking stack on my laptop was hosed.

I rebooted and everything seems to be working again. I can‘t even remember that happening a single time before on this machine.

Kind of strange it should happen right after my first blog posts in several months. Such is life sometimes. And every time also. #

Today’s links:

  • Elon: "You can access the X API via OpenClaw" - I use Github Actions :( x.com #

2026/04/19 #

Test from Android

Last night's test post actually worked pretty well. There were a few things that needed reconfiguring in the production environment, but it essentially worked. Today I'm getting it working from my Android phone. Again some slightly annoying configuration changes to do with environment setup, but the code looks like it's working. #

2026/04/18 #

Boring and uneventful test post

It‘s been a while. I‘ve been busy building a blogging tool.

I know the way these test posts tend to go, chances are it‘s not going to work first time, so I'll refrain from writing much.

Might post a few links too... #

2026/02/26 #

New blogging CLI tool

It‘s been a while since I‘ve written any blog posts. I‘ve been heads down on getting my blogging scripts updated the past 2 months. Quite a journey into writing CLIs, but I reached a milestone yesterday, I was able to successfully write a post using the new system. Still some things to figure out, but it means a much more streamlined process from writing words, to getting them onto the website, all via Github, with individual PRs for each post, and a ton of automation so I don't have to worry about getting the frontmatter right, or naming files, or putting things in the right place. It's all automatic.

Anyhow just wanted to put a short post out there, I’m still using the old system to write this, but if all goes well then I will be using the new CLI tool soon. Hoping everyone is well out there. #

2026/01/12 #

Multi-dimensional intersection

I‘ve been spending quite a lot of time writing specifications the past week or so. I‘m planning on making some modifications to my blogging scripts, turning them into a full blown CLI tool. And while doing that I also found some really neat improvements I can make to my static site renderer. It’s been very productive. It’s mind boggling how much further you can get using AI tools. It takes a bit of getting used to it as there are some annoyances that you have to find some workarounds to, but when you do it’s possible to architect much larger and more elegant systems than you would be able to do without AI, you can really think something through in so much more depth and breadth than you would otherwise be able to.

Anyway I had been looking for possible names for a module I was building, and the word constructivism popped up while going through some art-related terms that had a builder / utilitarian vibe. So I was looking at pictures of constructivism art to remind myself what it was all about. Well it occurred to me that it might be a strange and interesting juxtaposition to have some psychedelic constructivism. And so me and Gemini went off on a slightly frivolous side quest exploring various things and I was looking up art examples again, so I could try and have Gemini generate some amalgam of the two types of art.

Well that didn't work out very well. After a few tries, I realised Gemini was just sending back the same picture over and over. Oh well not to worry. Then I realised something very bizarre had happened with the two examples I had chosen out of many. I didn’t pay much thought to it, I just chose one of each type that I liked. And these were they:

Constructivism

Psychedelia

What a great reminder that two very different ways of looking at the world can both describe the exact same reality. It’s so strange that I didn’t see it at first. But now that I do, there is something very comforting about it. Yep, we see it too, but weirdly.

When I got back to writing the specification, I must have really confused Gemini. I don't think it understood what a side quest was, or that we were just taking a break from the spec writing and it kept trying to add amusing art stuff into the specification. I was trying to take out these references that didn't make much sense. But I eventually relented. Gemini was really insistent that my new tools needed to be pointy and wavey. It’s how it described the core philosophy. It‘s ridiculous but I thought might as well just leave it in there because it was funny.

But the really funny thing is that the more I think about it, I think that Gemini in this case might actually be onto something. #

2025/12/28 #

I have always liked Christmas and eating cake. #

2025/12/19 #

Changes partially successful

Yesterday’s changes were partially successful.

First of all there was the Bluesky clickable links, which were completely successful. Links in Bluesky are now consistently clickable. That’s what I expected, the change was quite straight forward and predictable.

Secondly there was the social media cards. At first it looked like it had been a complete failure, with none of Bluesky, Twitter and Nostr showing any cards for the latest posts. Kind of disappointing, especially since Twitter and Nostr had previously been adding card sometimes. Have I broken things? Hard to tell, because it’s so hit or miss.

But then my faith in the digital world was at least partially restore, because Mastodon had picked up the changes perfectly and created a card for both my latests posts! Props to Mastodon.

All this stuff is way too difficult and inconsistent imho. Isn‘t this supposed to be 2025? #

Unnexpected internet connectivity issues this evening. What is up with all this blocking world? :( #

2025/12/18 #

Bluesky clickable links

Although the social media auto-poster has been working well as far as I can tell since my last update a few days ago, I noticed that on Bluesky the links in the posts were not clickable. After a bit of research it turns out that Bluesky has an API called facets that gives you a way to turn the plain text you post into rich text. It's a bit of extra work to do this, but on the plus side you get quite a lot of control as to how the text appears. Anyhow, I made a few modifications and hopefully now the links should be clickable. #

Social media cards

markjgsmith

Following on from the fix to the links in the Bluesky posts, I decided to look into improving the metadata on my blog pages so that the various social medias create nicer looking cards for my posts. In the short term I’ll use a standard image for all my posts. I might add the ability to customise this on a per post basis later, but for now they should all get a classic white text on black background.

It was a bit tricky because although Twitter lets you choose whether you display the image full width, or as a small thumbnail, all the others make the choice for you based on the resolution of the image you add in the meta data in your page <head>. I used ffmpeg to generate the image, slightly higher res for Twitter, and I updated my sites templates so the meta tags point to the right image.

The intention is for the image to appear as a small thumbnail on the left of the link, but we'll have to see how that goes, if it doesn't work I might need to make some adjustments. #

2025/12/17 #

Let's avoid the advertising distopia. What even is advertising, or distopia or indeed let's and avoid for the matter. Such is the importance of all this, but we probably shouldn't worry about it too much because guess what, that's a distopia too. Oh noes! We're all gonna die! :) #

I feel like we might be about to enter a phase where a large number of people are going to get trapped in impossibles, and where there are no right answers and you just end up hanging onto something for dear life and waiting for it to pass. Whatever ‘it’ is. The darkness possibly. The corners of reality that reality has forced us into. That maybe we are about to see some of the strange contortions that exist here there and everywhere. And with some sort of probabilistic mathematical certainty we will be forced into yet more contortions. And it might at times look very ugly. #

2025/12/16 #

The world is on an epic allow blocking rampage at me today. It's hard to put into words. Perhaps I'll disappear into an acme hole. Feel like that would be the world's favorite option. Apparently I'm impossible. Well guess what world, if I'm impossible, then you're impossible too. #

It's really quite unbelievable but the world would like things to be even more impossible. That appears to be it's answer to everything. Just add more impossible. #

Destiny always seems to find a way to squeeze in one more more. I'm completely physically and mentally exhausted. #

It literally never ends, the literal next moment after the last note, and the world added another little extra bit on top. Literally literally literally. Literally.

It's pointless asking for a stop, because that means more. Everything means more. #

The Eternal

It's been kind of a strange week, and particularly today. As I sat down exhausted earlier, following a long long journey of one synchronicity after another, I started listening to some Sonic Youth. I haven't been listening to much music at all recently, but back in the 90s I used to listen to them a lot. Not sure I've listened to them all that much since that time. It was those years right at the end of school, and the first few in university.

Anyhow I skipped through a couple of their earlier albums on youtube, and they were ok, but you know remembering the past can be a bit weird. You're not the person you used to be, and so the tracks don't always sound as great as you remember them. Well I eventually landed on their album The Eternal. I remember buying this album when it came out, and I listened to it a lot. It's from 2009 which is quite a bit later than I thought it was. Pretty sure I wasn't listening to them then. But I really remember the artwork and especially the guitars.

I think a lot people might listen to this and not understand it, at least at first. The notes are odd in some places and it's very confusing in other places, but there are these moments of sereneness and calm, and if you listen to the whole thing as an album, the sounds tell a story. You don't need to understand all the words, though some might jump out at you. There is this incredible beauty that sort of emerges out of the chaos, or maybe it was there all along but you just didn't notice it. And when you notice it you are like oh right, I get it now. I get some part of another person on the other side of the world, and some part of all the people that listened to this band.

As an album it's very much like watching a movie. I hadn't noticed that before. It's like Easy Rider but also completely different. Like it has some part of the flavour of Easy Rider. I'm really struck by how film-like it is as an album. After listening to it I really felt like I just walked out of a movie theatre. That feeling of, wow what did I just see, that was really incredible, and just like with the best movies I'm thinking about pieces of it, but also memories it conjured up. What's super bizarre is that it's the sounds, and the feelings, the ambience of the thing, rather than images, and it sort of fades out into the distance.

Youtube of course was playing all sorts of adds in between tracks, which for some reason I found very funny. They were so obnoxiously out of place, but that for some reason had a kind of comedy juxtaposition to it. The other thing that I find super interesting is that according to their wikipedia page, it got to number 18 in the charts in the US (they are a US band), number 42 in the UK, and very similar numbers in all other countries across Europe, except for one country where it charted at number 9, in Belgium where I grew up. There's some part of me, from a long time ago that looks a lot like how this album sounds. #

2025/12/15 #

Today’s links:

2025/12/14 #

Saving state

Very important thing state. And saving state, well that’s doubly important. I thought the auto-poster was up and running, and I wasn’t wrong. But it turns our the final job in the workflow that saves the state of the feed reader, wasn’t running and the result of that was that unknown to me, everyday all posts since I started running it, were getting posted again. Thankfully I noticed it this morning.

After a deep dive into figuring out what was going on, it seems like the if statement I was using for that job was causing an issue. According to Gemini the logic wasn’t flawed, but it was quite complex and apparently Github Actions can sometimes run into issues with complex ifs. hat I was trying to do was only save the sate if any of the post jobs succeeded. But that was trying to be too clever.

I’ve refactored and have come up with a simpler way. Instead of trying to figure out if any posts succeeded, now when I find new posts, I just always save the state no matter what, but then I have a extra job at the end that throws an error if any of the post jobs failed. Hopefully I will thus always avoid double posting, but also there will be an errored job if something goes wrong, which hopefully I will notice.

All this to say that it really should be operational now. If you see this post on my socials tomorrow on it’s own you know the change worked, and if it’s accompanied by a load of old posts, then I am probably pulling my hair out and staring at VSCode. #

Today’s links:

  • Trump: Make Europe Austro-hungarian again. www.dw.com #

  • zrepl is a one-stop, integrated solution for ZFS replication. zrepl.github.io #

  • "Simple cloud service to store ZFS snapshots" - Simple off-site backups. zfs.rent #

  • Syncthing - Open source software and protocol to synchronize files between 2 or more computers in realtime. No need to go through the cloud. syncthing.net #

2025/12/13 #

Writing CLIs

Making

I re-wrote all my blogging scripts a couple of months ago. That’s been a resounding success. I use them most days, and it’s made my blogging workflow much more streamlined. I have some more improvements I’d like to make, and some interesting future projects I want to be in a position to explore. The annoying thing with the scripts in their current form is that they are written in Bash. Things can get kind of gnarly in Bash.

To be clear, I have nothing against Bash. It’s really useful for getting things up and running quickly. It’s very practical, and flexible and you have a million tools at your disposal that are tried and tested, and they tend to work quite well together. But when you want to do something a bit more elegant than just running a sequence of commands one after the other, with a few ifs and loops, then it can seem very archaic. So I’ve decided to re-write my blogging scripts in Node.js.

I’m pretty excited about this, because it will turn my very functional, but somewhat clunky blogging tools, into a streamlined, efficient and extensible command line interface (CLI). I have written a few CLIs over the years, but the past few years my energies have been mostly focussed on web development, so it’s been very interesting discovering all the new CLI focussed libraries that now exist. Things in CLI-land are orders of magnitude better than they were last time I was here.

The most useful libraries so far have been:

I also decided on using the more modern ES Modules rather than CommonJS, and so opted to use Vitest for my testing framework instead of Mocha or Jest. I was already running Vitest on all my React frontend projects, but it turns out it’s great out of the box with any ESM based projects. So far no major issues.

I already have a minimal Node.js project up and running, and I’m likely going to spend some time updating it to Typescript, given how successful Typescript has been in all my recent web development projects, especially those that I have been working on with AIs. Feeling pretty good about it :) #

Today’s links:

  • Rclone syncs your files to cloud storage rclone.org #

  • Singing for Animals compilation. I thought this was kind of amazing. www.youtube.com #

  • Parrot at the vet. Funny but not real. Also made me wonder if the previous link was real or not. The everything can be faked world is gonna be very weird. www.youtube.com #

  • Saylor selling his futuristic digital credit instruments in the middle east. The end is kind of wild. Infinity as a service? x.com #

  • Marktext - A simple and elegant markdown editor, available for Linux, macOS and Windows. github.com #

  • CFTC Launches Digital Assets Pilot Allowing Bitcoin, Ether and USDC as Collateral. www.coindesk.com #

2025/12/09 #

Auto-poster up and running

I figured out the Github Actions scheduling issue from the past two days. Turns out I had a bug in my cron. At some point during testing I had inadvertently updated a value that I shouldn’t have which meant it was trying to run much more often than I had intended. When you setup cron on a real local linux system, that’s not normally an issue, in fact that’s usually how you test these things, but in a hosted environment like Github, things behave somewhat unexpectedly.

What happens is they run a few times, then they just drop and don’t show up again. Which makes debugging very difficult, but I guess from their perspective it keeps their scheduler protected from unnecessarily high load. And of course for whatever reason no matter how much I looked at the workflow file, or all the various things I tried modifying, my brain just would not see the 1 character bug I had introduced. Thankfully Clay from Github support found it almost immediately. The auto-poster should hopefully be running smoothly now. Thanks Clay! #

Today’s links:

  • Tiny Core Linux - Nomadic ultra small (~16MB) graphical desktop operating system capable of booting from cdrom, pendrive, or frugally from a hard drive. www.tinycorelinux.net #

  • Bcachefs is an advanced new filesystem for Linux, ZFS inspired, Filesystem as a database. bcachefs.org #

  • Codeberg is a Github clone - "Codeberg is a non-profit, community-led effort that provides Git hosting and other services for free and open source projects". codeberg.org #

  • I asked Gemini to tell me a really funny cellular automata themed joke. As is often the case, things got a bit ridiculus. gemini.google.com #

  • Cryptoeconomics - "Fundamental Principles of Bitcoin" - Audio version distributed via a podcast, kind of hardcore but contains concise descriptions of all the theories underpinning Bitcoin. voskuil.org #

2025/12/08 #

Sorry about the duplicates

I am still trying to iron out all the creases in my new social media auto-poster. It ran last night, and successfully posted to all the social medias! But for some bizare reason that I can't figure out, it ran 4 times, which of course means that it auto-posted the same linke 4 times to all thje social medias. This was the same thing that happened the day before in testing, but I had put it down to the scheduler being over-loaded. I have openned a ticket up with Github support, hopefully I’ll hear back from them soon. So apologies for the duplicates. Please bear with me. #

Blocking and allowing

The world is doing that thing it always does when I release some software I have been working on for a long time, where it is infinitely upset that it has had to be waiting for so long for me to finally finish the software, so it can get on with the thing it was doing before it was so rudely interrupted by my audacious tiny and insignificant software. Poor thing.

The way this manifests is a tsunami of progressively more intense nudges trying to control or influence the tiny minutia in my life. Seems strange to say but it happens in multiple dimensions, at different abstraction levels, one after the other, until there is a bizare synchronicity in pretty much everything I do. And what inevitably ensues is it blocking the very thing it is trying to get me to do. And so it gets even more upset at me not doing the thing it wants me to do, even though it won't let me do the thing!

And I already know that even if I do the thing that it wants me to do, that it will be upset, because I will inevitably be doing it wrong, yet again. And so the vicious cycle continues, and escalates.

It’s very hard to describe, and it’s even harder to deal with, especially because you naturally start second guessing everything. I bet this is another weirdness. And sure enough it is. Ok well, I'll just quietly step away, hoping it doesn't get worse. And of course that in itself creates disturbances in the spacetime continuum. When it gets really bad it's feels like when you try and rebase two branches the wrong way around, and literally every commit becomes a merge conflict. Thankfully, today it's not that bad, at least so far.

It reminds me of the binds that AI systems get themselves into, where it can’t decide on something, and each time you ask it something, it confidently decides the opposite. A strange probability loop. I have no more words to describe it.

In these times, I think the best thing is to just slow down, though as I write this, I can’t quite remember what the best approach is. Everything feels off today.

And so it goes. #

Today’s links:

2025/12/07 #

First few posts

Modern Times

Well yesterday's inaugural run of the auto-poster didn’t go exactly to plan. In fact it didn’t run at all. I didn’t really expect that it would have worked first time, though I was sort of hopeing that it would. Oh well.

I spent much of the morning trying to figure out why the scheduled trigger in the Github Action wasn’t launching any jobs. I updated it from running once daily to once every 5 minutes, and it still wasn’t running. No errors anywhere, just nothing. After a few hours I gave up and moved onto something else.

When I checked again a bit later, several jobs had been launched which then had errored. The first one starting almost 2 hours after it was supposed to start. And then it had run 4 times in an hour, which certainly wasn’t once every 5 minutes. I guess the Github scheduler is under stress? Kind of strange.

Anyhow since I had confirmed that at least the scheduler was working even if it was a bit temperamental, I started testing each poster with dryrun set to false. This was the first time I had tested live, and so I uncovered a few small bugs and some secrets that were missing. Eventually I managed to post to all social medias apart from LinkedIn. The LinkedIn API is really narly. I ended up commenting it out for now.

Anyway, yesterday’s blog post was re-posted to Mastodon, Twitter, Nostr, Bluesky. Pretty cool :)

So all the poster scripts are tested in live mode and the scheduler appears to be working, all be it sometimes with a big delay, but hopefully at some point in the early hours tomorrow, this post will get auto-posted to all the socials mentioned above. #

2025/12/06 #

Refactoring and minimal examples

Usually when you are writing software it’s good idea to start small and build up. When things are complex, there are just too many things that can go wrong, and they inevitably do.

But sometimes even when you do diligently do that, you get into trouble because the platform you were building on is inconsistent or missing a key feature, or behaves in a non-intuitive way. You thought you knew how it worked but it turns out that the way you thought it worked was not the full picture.

In these times, things get very confusing, you find yourself going around in circles, and it can get quite gnarly, because you are changing things here and there trying to debug things. And one thing leads to another thing, and the AI you are working with takes you down a ridiculous route that was totally unnecessary.

At some point you decide that you need to start again from scratch. Rebuilding the absolute most minimal example of the thing you are trying to solve. It’s a bit of an art. It can seem like a total pain, but it’s often much much faster the second time around, once you have figured out the solution to the problem that is.

And it can happen several times that you think you have figured it out, when actually you hadn't quite. It’s a bit like one of those dreams where you wake up and then a bit later, you wake up again. Oh it was a dream in a dream in a dream!

Each time you get a bit closer, and a bit more certain you really have figured it out, because you understand the problem space much better than before. And it feels good.

But there is always the possibility you missed something.

I think I have the social media auto-poster figured out. It’s running on the blog now, and so at some point this evening after the daily build runs, hopefully this post will get published to some of my socials medias. #

Older posts: check out the archives.

For enquiries about my consulting, development, training and writing services, aswell as sponsorship opportunities contact me directly via email. More details about me here.