Header image for Cross Post for Dev.to plugin

WordPress Plugin Cross Post for Dev.to: my solution to abandoned and unmaintained plugins

I’ve released Cross Post for Dev.to, a WordPress plugin that mirrors a post to Dev.to the moment you publish it on your own site. The plugin itself is simple: one hook, one API call, one published mirror. The interesting part of this release isn’t the feature. It’s what had to be true for a zero-dependency plugin to stay trustworthy over time without me babysitting it.

The problem

Most small WordPress plugins rot over time. They’re built against whatever WordPress version happens to be current, they lean on a third-party library or two to save time, and neither the plugin nor the library gets revisited until something breaks. Usually a major WordPress release, sometimes a PHP version bump. At that point the maintainer generally abandons the project and so many of these lesser used plugins become useless for users.

Cross-Post for Dev.to needed to cross-post reliably from WordPress to Dev.to without letting that happen so easily. No bundled third-party SDKs, no external service sitting between the plugin and the Dev.to API, no dependency that could go unmaintained while the plugin using it kept shipping.

Why zero-dependency isn’t the whole answer

Removing dependencies fixes one kind of rot but not the other. A plugin with no third-party packages can still quietly break against a new WordPress release; deprecated hooks, changed REST behaviour, PHP version drift. Zero dependencies means less that can fail underneath you; it says nothing about whether the plugin still works today. Those are two different guarantees, and conflating them is how “lightweight” plugins end up just as unmaintained as heavy ones, only with fewer visible warning signs.

So the actual problem wasn’t “avoid dependencies.” It was “know, continuously and automatically, whether this plugin still works”. Which is a validation problem, not a packaging problem.

Continue reading →

Header image for my article on PromoForge, catchy tagline.

PromoForge

Over the past few years I’ve been running a gaming YouTube channel, Chambers Plays Games, and like most small creators I’ve found that making the content is only half the battle. The other half is the relentless work of promoting it… writing tweets, scheduling posts, engaging with other channels, and keeping track of which accounts in your following list are actually worth keeping around. I was doing all of this manually, which was both time-consuming and inconsistent. So, as I’ve done more than once before with problems that annoy me enough, I decided to write a tool to solve it.

That tool is PromoForge.

This isn’t my first attempt at Twitter automation. Back in early 2018, as part of a #30DayDev challenge, I built and open-sourced the Microcosm retweet bot, a Python and Tweepy script that retweeted content from a configurable set of hashtags on a schedule. It did one thing and did it reasonably well, and I wrote about it on this blog at the time. The repository is now archived. PromoForge is in some ways the natural successor to that project, built on the same instinct to automate the repetitive parts of being online, just considerably more ambitious about what “automated” actually means.

What started as a fairly simple idea (fetching my YouTube videos and generating tweets for them) has grown into something considerably more ambitious over the last ten days. This post covers what’s been built, some of the more interesting challenges I ran into along the way, and where I plan to take it next.

What Is PromoForge?

At its core, PromoForge is a promotion and audience-growth platform built specifically for gaming content creators. It has two entry points: a command-line tool for headless operation, and a full web UI that you run locally and access through your browser. The web interface is where most of the action happens and it covers three broad areas of work: content scheduling, audience growth, and channel maintenance.

The scheduling side of things works by connecting to the YouTube Data API, fetching your public videos, and then generating algorithm-optimised tweets for each one. It detects which game is being played from the video title using a combination of exact matching and fuzzy search, selects appropriate hashtags from a curated set, and composes a tweet from a template library. You can export everything as a CSV or push directly to Buffer or X’s own scheduling API. The whole flow from “fetch my videos” to “tweets are scheduled” can be done in a couple of clicks.

The tweet generation interface showing video source options, days to look back, number of tweets, start date, posting time, and tweet spacing settings
The generation panel. You choose the video source (recent videos, full history, highest viewed, etc.), set your schedule preferences, and hit Fetch & Generate. The AI enhancement feature can then refine each tweet using the Anthropic API.
Continue reading →
Retro Game Header Image

Looking Back At Bob’s Space Crusade

Bob’s Space Crusade was the first game I ever published, it was released on Kongregate, on the 30th of December 2011. It was my first project using Unity3D and it served as a great learning experience in actually getting something out there to be played by the world. It was by no means a masterpiece but the character (who I still have plans to resurrect in future projects) and core mechanic was great. This post will talk about how Bob was originally brought to life and the process that was behind that.

Going into this project I had a single focus, keep things simple. I didn’t want a spiralling list of features that could never be achieved, I just wanted a core mechanic that was fun and simple. This was for a couple of reasons, the main being I didn’t have enough experience to actually finish a large expansive project. The main goal of the project was to finish it, which I did. In hindsight, I would say the scope was too restrictive, the project in its initial state didn’t play particularly well and would have benefitted greatly from an increased development time.

Continue reading →