<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="4.3.4">Jekyll</generator><link href="https://www.binarymoon.co.uk/feed.xml" rel="self" type="application/atom+xml" /><link href="https://www.binarymoon.co.uk/" rel="alternate" type="text/html" /><updated>2026-04-01T23:02:04+01:00</updated><id>https://www.binarymoon.co.uk/feed.xml</id><title type="html">Ben Gillbanks</title><subtitle>Creativity on the web</subtitle><author><name>Ben Gillbanks</name></author><entry><title type="html">Improving Related Posts Across My Sites</title><link href="https://www.binarymoon.co.uk/writing/related-posts/" rel="alternate" type="text/html" title="Improving Related Posts Across My Sites" /><published>2026-04-01T00:00:00+01:00</published><updated>2026-04-01T00:00:00+01:00</updated><id>https://www.binarymoon.co.uk/writing/related-posts</id><content type="html" xml:base="https://www.binarymoon.co.uk/writing/related-posts/"><![CDATA[<p>A few years ago I switched to Jekyll across all of my sites, and one of the things I enjoy most is that the content is stored as markdown files, and so is easy to work with.</p>

<p>When I first switched to Jekyll I wanted to have related posts on my sites. With WordPress I used Jetpack related posts, but Jekyll didn’t have anything similar. So I built my own related posts system using PHP. I made a small control panel as well, so I could easily trigger updates.</p>

<p>These days I use a shared related posts library which updates the related posts across many of <a href="https://bengillbanks.co.uk">my websites</a>, which means I only have to solve this problem once and every site benefits. The library loads in specified markdown files, extracts the text content, and then compares posts using Jaccard similarity. It then saves the results as front matter in the markdown files.</p>

<p>Recently I started to feel like the results were a bit off. Posts that should have been obvious matches were sometimes missing, so I wanted to take a closer look at what was actually going on, and it turned out there were a few small improvements I could make.</p>

<h2 id="html-improvements">HTML Improvements</h2>

<p>The first issue was how I handled HTML. I was stripping it out entirely, which seemed sensible at first since I didn’t want any markup interfering with the rankings, but in doing so I was also removing useful information.</p>

<p>Link text in particular carries a lot of meaning, especially in blog posts where links often describe concepts or tools. So I adjusted the parsing to keep meaningful text like links while still removing the parts that add noise. This alone made quite a big difference in the quality of the matches.</p>

<h2 id="phrases-and-word-groupings">Phrases and Word Groupings</h2>

<p>Since I’d made some small improvements I thought I would dig a bit deeper and see if there were any other quick wins.</p>

<p>Originally, everything was based on individual words, which does work, but misses phrases made up of multiple words. Brand names, or people names, for example. To tackle this in the early version I manually created a list of common word pairs that would be stored as pairs.</p>

<p>This time I automated the whole thing. I split the text into words, then combined neighbouring words to create phrases. Most of them were nonsense, but after removing the phrases that only appeared once I ended up with some useful groups. I could then use this code to automate creating two-word, three-word, and four-word groupings without any manual effort. Because it is driven by the content itself, it adapts naturally to whatever I write.</p>

<p>I then used these as “words” in the Jaccard similarity rankings, which means that if two posts both mention “machine learning” as a phrase, it will be treated as a stronger match than if they just had the words “machine” and “learning” separately. This helps to surface more relevant related posts, especially when there are specific terms or concepts that are important to the content.</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>function create_ngrams( $words, $n = 2, $multiplier = 2 ) {

	$ngrams = [];
	$words = array_values( $words );
	$count = count( $words );

	for ( $i = 0; $i &lt;= $count - $n; $i++ ) {

		$parts = array_slice( $words, $i, $n );

		// Skip if any word is empty
		if ( in_array( '', $parts, true ) ) {
			continue;
		}

		// Skip if the words are the same.
		if ( count( array_unique( $parts ) ) !== $n ) {
			continue;
		}

		$phrase = implode( ' ', $parts );
		$ngrams[] = $phrase;
	}

	// Count occurrences
	$ngrams = array_count_values( $ngrams );

	// Only keep repeated phrases
	$ngrams = array_filter(
		$ngrams,
		function( $count ) {
			return $count &gt; 1;
		}
	);

	$result = [];

	// Add each phrase to the result array as many times as it occurs, multiplied by the multiplier.
	// This way, phrases that occur more frequently will have a greater influence on the Jaccard similarity score.
	foreach ( $ngrams as $phrase =&gt; $count ) {
		for ( $i = 0; $i &lt; $count * $multiplier; $i++ ) {
			$result[] = $phrase;
		}
	}

	return $result;
}
</code></pre></div></div>

<h2 id="singular-and-plural-forms">Singular and Plural Forms</h2>

<p>The last improvement was handling singular and plural forms of words. Previously, “game” and “games” would be treated as completely separate terms, which reduces the similarity scoring. To calculate plurals I went with a lightweight approach. I created a few simple rules based on common plural patterns and then layered in a handful of exceptions for the irregular cases I tend to use. This probably misses some plurals but it does catch the most common giving more weight to connected words.</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>function stem_word( $word ) {

	static $exceptions = [
		'vertices' =&gt; 'vertex',
		'indices' =&gt; 'index',
		'matrices' =&gt; 'matrix',
		'analyses' =&gt; 'analysis',
		'theses' =&gt; 'thesis',
		'crises' =&gt; 'crisis',
		'axes' =&gt; 'axis',
		'series' =&gt; 'series',
		'species' =&gt; 'species',
	];

	if ( isset( $exceptions[ $word ] ) ) {
		return $exceptions[ $word ];
	}

	$len = strlen( $word );

	if ( $len &lt;= 3 ) {
		return $word;
	}

	// libraries -&gt; library
	if ( preg_match( '/[^aeiou]ies$/', $word ) ) {
		return substr( $word, 0, -3 ) . 'y';
	}

	// boxes -&gt; box, classes -&gt; class, brushes -&gt; brush
	if ( preg_match( '/(xes|ches|shes|sses|zzes)$/', $word ) ) {
		return substr( $word, 0, -2 );
	}

	// pages -&gt; page, games -&gt; game, tools -&gt; tool
	if (
		substr( $word, -1 ) === 's' &amp;&amp;
		! preg_match( '/(ss|us|is)$/', $word ) &amp;&amp;
		$len &gt; 4
	) {
		return substr( $word, 0, -1 );
	}

	return $word;
}
</code></pre></div></div>

<h2 id="all-done">All Done</h2>

<p>With these changes combined, the related posts are now much more accurate.</p>

<p>Because all of my sites use the same build system, changing this one library is like changing a WordPress plugin; it updates all of my sites automatically. Jekyll builds a static site, so the related posts are calculated before the site is generated, and then the build is fast since it doesn’t need to calculate them in Jekyll.</p>]]></content><author><name>Ben Gillbanks</name></author><category term="[&quot;Web Development&quot;, &quot;Jekyll&quot;]" /><summary type="html"><![CDATA[A few years ago I switched to Jekyll across all of my sites, and one of the things I enjoy most is that the content is stored as markdown files, and so is easy to work with.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://www.binarymoon.co.uk/assets/images/binarymoon-giant-avatar.png" /><media:content medium="image" url="https://www.binarymoon.co.uk/assets/images/binarymoon-giant-avatar.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">The Games I’ve Made (So Far)</title><link href="https://www.binarymoon.co.uk/writing/my-games/" rel="alternate" type="text/html" title="The Games I’ve Made (So Far)" /><published>2026-03-11T00:00:00+00:00</published><updated>2026-03-11T00:00:00+00:00</updated><id>https://www.binarymoon.co.uk/writing/my-games</id><content type="html" xml:base="https://www.binarymoon.co.uk/writing/my-games/"><![CDATA[<p>I was recently asked for a list of the games I have worked on over the years. That question sent me down a bit of a rabbit hole. I realised I don’t actually have a single list anywhere. Some of the games still exist online, some are tucked away on old hard drives, and some have quietly disappeared into the depths of the internet.</p>

<p>Still, looking back, there have been quite a lot of them.</p>

<h2 id="the-early-days-darkbasic-and-blitz3d">The Early Days: DarkBASIC and Blitz3D</h2>

<p>I started out making games in the early 2000s. My first tools were <a href="https://en.wikipedia.org/wiki/The_Game_Creators#DarkBASIC">DarkBASIC</a> and later <a href="https://en.wikipedia.org/wiki/Blitz_BASIC#Blitz3D">Blitz3D</a>, both of which were fantastic for hobbyist developers. They made it possible to jump straight into building 3D games without needing a huge engine or complicated setup.</p>

<p>During that period I worked on several projects, but the following stand out in particular.</p>

<h3 id="rocket-boards">Rocket Boards</h3>

<p><em>Rocket Boards</em> was a fully 3D racing game built with Blitz3D. It was inspired by games like <em>Mario Kart</em>, although instead of karts the racers rode hoverboards. The idea was simple: fast arcade racing on futuristic tracks with a cast of quirky riders.</p>

<p>The game featured 8 playable racers, and 16 different tracks. Apart from the music, I created everything for the game myself. That meant the programming,3D art, track design, and general game design.</p>

<div class="d:grid grid-cols2">
<figure class="m-b3"><img class="b-br1 display-block m-auto" src="/wp-content/uploads/2023/06/rocket1.jpg" alt="*" loading="lazy" width="526" height="395" />
</figure>

<figure class="m-b3"><img class="b-br1 display-block m-auto" src="/wp-content/uploads/2023/06/rocket2.jpg" alt="*" loading="lazy" width="526" height="395" />
</figure>

<figure class="m-b3"><img class="b-br1 display-block m-auto" src="/wp-content/uploads/2023/06/rocket3.jpg" alt="*" loading="lazy" width="526" height="395" />
</figure>

<figure class="m-b3"><img class="b-br1 display-block m-auto" src="/wp-content/uploads/2023/06/rocket4.jpg" alt="*" loading="lazy" width="526" height="395" />
</figure>

<figure class="m-b3"><img class="b-br1 display-block m-auto" src="/wp-content/uploads/2023/06/rocket5.jpg" alt="*" loading="lazy" width="526" height="395" />
</figure>

</div>

<p>One of the most exciting moments for me was having <em>Rocket Boards</em> published in <strong>physical stores</strong> by a budget games publisher. Walking into a shop and seeing a game you made sitting on a shelf is a pretty surreal experience.</p>

<h3 id="limit-rush">Limit Rush</h3>

<p>Around the same time I created a large tutorial series based around a game I made called <em>Limit Rush</em>. This project used DarkBASIC and was designed both as a playable game and as a teaching tool.</p>

<p>Limit Rush was a 3D capture-the-flag style arena game. You piloted a hovercraft around a futuristic arena while competing against computer-controlled opponents. The goal was to reach the targets scattered around the map before the other racers.</p>

<p>The tutorial walked through how the game was built step by step, covering things like movement, enemy behaviour (AI), and basic game systems. It ended up becoming a fairly substantial learning resource for people getting started with DarkBASIC.</p>

<h2 id="bubble-blitz">Bubble Blitz</h2>

<p>I also tried my hand at a colour matching puzzle game called Bubble Blitz. This was based on a game called <em>Bubble Bomb</em>, which I published after the original developer had to stop making games.</p>

<div class="d:grid grid-cols2">
<figure class="m-b3"><img class="b-br1 display-block m-auto" src="/wp-content/uploads/2023/06/bblitz1.gif" alt="*" loading="lazy" width="526" height="395" />
</figure>

<figure class="m-b3"><img class="b-br1 display-block m-auto" src="/wp-content/uploads/2023/06/bblitz2.gif" alt="*" loading="lazy" width="526" height="395" />
</figure>

<figure class="m-b3"><img class="b-br1 display-block m-auto" src="/wp-content/uploads/2023/06/bblitz3.gif" alt="*" loading="lazy" width="526" height="395" />
</figure>

<figure class="m-b3"><img class="b-br1 display-block m-auto" src="/wp-content/uploads/2023/06/bblitz4.gif" alt="*" loading="lazy" width="526" height="395" />
</figure>

</div>

<h2 id="the-miniclip-years">The Miniclip Years</h2>

<p>After my early indie experiments I joined <em>Miniclip.com</em> as their third employee. At the time they were focused entirely on browser games using Flash and Shockwave, 2 plugins that no-longer exist.</p>

<p>I originally joined as a game artist, but over time my role evolved and I eventually became the Director of Web Development overseeing the design and development of the website.</p>

<p>During my eleven years at Miniclip I worked on a lot of games. I honestly couldn’t give you a precise number, but it was probably somewhere between twenty and thirty projects. Most of these were smaller casual games built in Flash, which was the dominant platform for browser games at the time.</p>

<p>Below are (very small) screenshots of some of the games I worked on whilst at Miniclip. Unfortunately the games are no-longer available online, but you can see some of the art and design work I did for them.</p>

<p>I wrote a little more about them in a previous post about <a href="/2005/09/what-i-do-at-work/">what I do at work</a>.</p>

<div class="grid t:grid-cols2 d:grid-cols3">
	<figure class="m-b3"><img class="b-br1 display-block m-auto" src="/wp-content/uploads/xraye.jpg" alt="*" loading="lazy" width="220" height="130" />
</figure>

	<figure class="m-b3"><img class="b-br1 display-block m-auto" src="/wp-content/uploads/sudoku.jpg" alt="*" loading="lazy" width="220" height="130" />
</figure>

	<figure class="m-b3"><img class="b-br1 display-block m-auto" src="/wp-content/uploads/wheels.jpg" alt="Dr Carter and the Wheels of Salvation" loading="lazy" width="220" height="130" />
</figure>

</div>

<h2 id="indie-games">Indie Games</h2>

<p>While working at Miniclip I continued making my own games in my spare time.</p>

<p>Some of these were released as shareware puzzle games, which I sold online. This was during the era when independent developers could sell downloadable PC games directly from their websites.</p>

<p>I also entered a game design competition hosted by JayIsGames with a physics-based puzzle game called <a href="https://binarymoon.itch.io/roll">Roll</a> (you can play the original Flash game online using the wonderful ruffle javascript library). Competitions like that were always a lot of fun because they encouraged experimentation and unusual ideas.</p>

<div class="d:grid grid-cols2">
<figure class="m-b3"><a href="/wp-content/uploads/2026/roll1.png" class="display-block"><img class="b-br1 display-block m-auto" src="/cache/resize/05c78518-roll1-800x2000-g.webp" alt="*" loading="lazy" width="800" height="600" /></a>
</figure>

<figure class="m-b3"><a href="/wp-content/uploads/2026/roll2.png" class="display-block"><img class="b-br1 display-block m-auto" src="/cache/resize/d75df965-roll2-800x2000-g.webp" alt="*" loading="lazy" width="800" height="601" /></a>
</figure>

<figure class="m-b3"><a href="/wp-content/uploads/2026/roll3.png" class="display-block"><img class="b-br1 display-block m-auto" src="/cache/resize/16d397b0-roll3-800x2000-g.webp" alt="*" loading="lazy" width="800" height="598" /></a>
</figure>

</div>

<p>Eventually I shifted away from Flash and moved toward HTML5 game development, particularly using the <a href="https://phaser.io/">Phaser</a> framework. Phaser made it possible to build browser games using modern JavaScript, which suited me perfectly.</p>

<p>During this time I created several small games. These were built for the <em>LowRezJam</em> Games Jam, which challenged developers to create games with a resolution of 64x64 pixels or less. Working under those kinds of constraints is surprisingly liberating. You stop worrying about building a huge project and instead focus on making something small and fun.</p>

<h3 id="legend-of-dad"><a href="https://binarymoon.itch.io/the-legend-of-dad-quest-for-milk">Legend of Dad</a></h3>

<p>A small adventure game about a dad (me) on a quest to find milk for his child.</p>

<div class="grid t:grid-cols2">
<figure class="m-b3"><img class="b-br1 display-block m-auto" src="/wp-content/uploads/2016/07/rpg_bridge.png" alt="RPG Bridge Screenshot" loading="lazy" width="400" height="400" />
</figure>

<figure class="m-b3"><img class="b-br1 display-block m-auto" src="/wp-content/uploads/2016/07/rpg_garden.png" alt="RPG Garden Screenshot" loading="lazy" width="400" height="400" />
</figure>

<figure class="m-b3"><img class="b-br1 display-block m-auto" src="/wp-content/uploads/2016/07/rpg_room.png" alt="RPG Room Screenshot" loading="lazy" width="400" height="400" />
</figure>

<figure class="m-b3"><img class="b-br1 display-block m-auto" src="/wp-content/uploads/2016/07/rpg_island.png" alt="RPG Island Screenshot" loading="lazy" width="400" height="400" />
</figure>

</div>

<h3 id="pixel-peak"><a href="https://binarymoon.itch.io/pixel-peak">Pixel Peak</a></h3>

<p>A time challenge skiing game inspired by classic arcade games like SkiFree.</p>

<div class="d:grid grid-cols2">
<figure class="m-b3"><img class="b-br1 display-block m-auto" src="/wp-content/uploads/2017/10/day-9.2.png" alt="Pixel Peak Title Screen" loading="lazy" width="256" height="256" />
</figure>

<figure class="m-b3"><a href="/wp-content/uploads/2017/10/day-5.jpg" class="display-block"><img class="b-br1 display-block m-auto" src="/cache/resize/63ec506f-day-5-800x2000-g.webp" alt="Pixel Peak Level being Edited" loading="lazy" width="800" height="500" /></a>
</figure>

<figure class="m-b3"><a href="/wp-content/uploads/2017/10/day-3.png" class="display-block"><img class="b-br1 display-block m-auto" src="/cache/resize/175cf699-day-3-800x2000-g.webp" alt="Pixel Peak Level being Edited" loading="lazy" width="800" height="800" /></a>
</figure>

</div>

<h3 id="star-raid"><a href="https://binarymoon.itch.io/star-raid">Star Raid</a></h3>

<p>An exploration game where you hunt for coins on an abandoned mining facility.</p>

<div class="t:grid grid-cols2">
<figure class="m-b3"><img class="b-br1 display-block m-auto" src="/wp-content/uploads/2023/06/star-raid-title.png" alt="Star Raid Title" loading="lazy" width="315" height="250" />
</figure>

<figure class="m-b3"><a href="/wp-content/uploads/2023/06/star-raid-screenshot-1.png" class="display-block"><img class="b-br1 display-block m-auto" src="/cache/resize/470b255b-star-raid-screenshot-1-800x2000-g.webp" alt="*" loading="lazy" width="800" height="800" /></a>
</figure>

<figure class="m-b3"><a href="/wp-content/uploads/2023/06/star-raid-screenshot-2.png" class="display-block"><img class="b-br1 display-block m-auto" src="/cache/resize/637ba099-star-raid-screenshot-2-800x2000-g.webp" alt="*" loading="lazy" width="800" height="801" /></a>
</figure>

<figure class="m-b3"><a href="/wp-content/uploads/2023/06/star-raid-screenshot-3.png" class="display-block"><img class="b-br1 display-block m-auto" src="/cache/resize/1985b64a-star-raid-screenshot-3-800x2000-g.webp" alt="*" loading="lazy" width="800" height="802" /></a>
</figure>

<figure class="m-b3"><a href="/wp-content/uploads/2023/06/star-raid-screenshot-4.png" class="display-block"><img class="b-br1 display-block m-auto" src="/cache/resize/6d368c5e-star-raid-screenshot-4-800x2000-g.webp" alt="*" loading="lazy" width="800" height="797" /></a>
</figure>

<figure class="m-b3"><a href="/wp-content/uploads/2023/06/star-raid-screenshot-5.png" class="display-block"><img class="b-br1 display-block m-auto" src="/cache/resize/ce0ce898-star-raid-screenshot-5-800x2000-g.webp" alt="*" loading="lazy" width="800" height="800" /></a>
</figure>

<figure class="m-b3"><a href="/wp-content/uploads/2023/06/star-raid-screenshot-6.png" class="display-block"><img class="b-br1 display-block m-auto" src="/cache/resize/300edd89-star-raid-screenshot-6-800x2000-g.webp" alt="*" loading="lazy" width="800" height="800" /></a>
</figure>

<figure class="m-b3"><a href="/wp-content/uploads/2023/06/star-raid-screenshot-7.png" class="display-block"><img class="b-br1 display-block m-auto" src="/cache/resize/1e5881e7-star-raid-screenshot-7-800x2000-g.webp" alt="*" loading="lazy" width="800" height="800" /></a>
</figure>

<figure class="m-b3"><a href="/wp-content/uploads/2023/06/star-raid-screenshot-8.png" class="display-block"><img class="b-br1 display-block m-auto" src="/cache/resize/4847f52c-star-raid-screenshot-8-800x2000-g.webp" alt="*" loading="lazy" width="800" height="801" /></a>
</figure>

</div>

<h2 id="brush-ninja">Brush Ninja</h2>

<p>After leaving Miniclip I created <a href="https://brush.ninja/">Brush Ninja</a>, which is a browser-based tool for making animated GIFs.</p>

<p>Originally it started as a small experiment, but over time it grew into a full website. Today it hosts a range of creative tools as well as some of <a href="https://brush.ninja/play/">my browser games</a> (including Splatter Balls).</p>

<p>The main goal behind Brush Ninja is simple: encourage creativity, particularly among younger users. The internet has a lot of passive entertainment, but I’ve always preferred tools that let people create things themselves.</p>

<h2 id="beepmini">BeepMini</h2>

<p>More recently I have been working on my own open source retro game engine called <a href="https://beepmini.com">BeepMini</a>.</p>

<p>BeepMini is designed to make it easy to create small retro-style games in the browser. It has built-in graphics, sound tools, and a tile-based system that makes it quick to prototype ideas.</p>

<p>Alongside the engine I’ve also been creating <a href="https://beepmini.com/games/">a small collection of games built with it</a>. For these projects I’ve gone fully old-school and handled everything myself: programming, art, music, and sound effects. BeepMini is designed to make this easy, including built-in art and algorithmic music generation tools.</p>

<p>It’s been a really enjoyable way to experiment with game ideas without needing huge projects.</p>

<div class="grid grid-cols2 d:grid-cols3">
<!-- <figure class="m-b3"><a href="/wp-content/uploads/2026/b8-beepmini.png" class="display-block"><img
			class="b-br1 display-block m-auto"
			src="/cache/resize/1a4a0663-b8-beepmini-800x2000-g.webp"
			alt="*"
			loading="lazy"
			width='800' height='1000'
		/></a>
</figure>
 -->
<figure class="m-b3"><a href="/wp-content/uploads/2026/b8-chomper.png" class="display-block"><img class="b-br1 display-block m-auto" src="/cache/resize/d4aec938-b8-chomper-800x2000-g.webp" alt="*" loading="lazy" width="800" height="1000" /></a>
</figure>

<figure class="m-b3"><a href="/wp-content/uploads/2026/b8-crate-crew.png" class="display-block"><img class="b-br1 display-block m-auto" src="/cache/resize/cc0cec1a-b8-crate-crew-800x2000-g.webp" alt="*" loading="lazy" width="800" height="1000" /></a>
</figure>

<figure class="m-b3"><a href="/wp-content/uploads/2026/b8-fantasy-console.png" class="display-block"><img class="b-br1 display-block m-auto" src="/cache/resize/33fcfbc1-b8-fantasy-console-800x2000-g.webp" alt="*" loading="lazy" width="800" height="1000" /></a>
</figure>

<figure class="m-b3"><a href="/wp-content/uploads/2026/b8-key-kwest.png" class="display-block"><img class="b-br1 display-block m-auto" src="/cache/resize/437b050b-b8-key-kwest-800x2000-g.webp" alt="*" loading="lazy" width="800" height="1000" /></a>
</figure>

<figure class="m-b3"><a href="/wp-content/uploads/2026/b8-prime-time.png" class="display-block"><img class="b-br1 display-block m-auto" src="/cache/resize/ab298498-b8-prime-time-800x2000-g.webp" alt="*" loading="lazy" width="800" height="1000" /></a>
</figure>

<figure class="m-b3"><a href="/wp-content/uploads/2026/b8-tumble.png" class="display-block"><img class="b-br1 display-block m-auto" src="/cache/resize/8ee97de3-b8-tumble-800x2000-g.webp" alt="*" loading="lazy" width="800" height="1000" /></a>
</figure>

</div>

<p>Whilst working on BeepMini I have also been creating a game making platform for building retro adventure games. This is still in the early stages but you can see the <a href="https://beepmini.com/tools/adventure-game-maker/">adventure game maker</a> on the BeepMini website. The current version was used to build <a href="https://beepmini.com/games/key-kwest/">Key Kwest</a>.</p>

<h2 id="splatter-balls">Splatter Balls</h2>

<p>One of my more recent projects is <a href="https://brush.ninja/play/splatter-balls">Splatter Balls</a>, a physics-based pachinko-style game.</p>

<p>This game actually started life many years ago as a small experiment. Recently I picked it back up again with the goal to finish it off properly.</p>

<p>This time I have a collaborator: my 10 year old son. He has been helping design new levels and even provided the sound effects for the game. It has been great fun working on a project together, and seeing the kinds of ideas he comes up with.</p>

<div class="d:grid grid-cols2">
<figure class="m-b3"><img class="b-br1 display-block m-auto" src="/wp-content/uploads/2026/splatter-balls-1.png" alt="*" loading="lazy" width="352" height="667" />
</figure>

<!-- <figure class="m-b3"><img
			class="b-br1 display-block m-auto"
			src="/wp-content/uploads/2026/splatter-balls-2.png"
			alt="*"
			loading="lazy"
			width='352' height='667'
		/>
</figure>
 -->
<!-- <figure class="m-b3"><img
			class="b-br1 display-block m-auto"
			src="/wp-content/uploads/2026/splatter-balls-3.png"
			alt="*"
			loading="lazy"
			width='352' height='667'
		/>
</figure>
 -->
<!-- <figure class="m-b3"><img
			class="b-br1 display-block m-auto"
			src="/wp-content/uploads/2026/splatter-balls-4.png"
			alt="*"
			loading="lazy"
			width='352' height='667'
		/>
</figure>
 -->
<figure class="m-b3"><img class="b-br1 display-block m-auto" src="/wp-content/uploads/2026/splatter-balls-5.png" alt="*" loading="lazy" width="352" height="667" />
</figure>

<figure class="m-b3"><img class="b-br1 display-block m-auto" src="/wp-content/uploads/2026/splatter-balls-6.png" alt="*" loading="lazy" width="352" height="667" />
</figure>

<figure class="m-b3"><img class="b-br1 display-block m-auto" src="/wp-content/uploads/2026/splatter-balls-7.png" alt="*" loading="lazy" width="352" height="667" />
</figure>

<!-- <figure class="m-b3"><img
			class="b-br1 display-block m-auto"
			src="/wp-content/uploads/2026/splatter-balls-8.png"
			alt="*"
			loading="lazy"
			width='352' height='667'
		/>
</figure>
 -->
<figure class="m-b3"><img class="b-br1 display-block m-auto" src="/wp-content/uploads/2026/splatter-balls-9.png" alt="*" loading="lazy" width="352" height="667" />
</figure>

<figure class="m-b3"><img class="b-br1 display-block m-auto" src="/wp-content/uploads/2026/splatter-balls-10.png" alt="*" loading="lazy" width="352" height="667" />
</figure>

</div>]]></content><author><name>Ben Gillbanks</name></author><category term="[&quot;Video Games&quot;, &quot;Entertainment&quot;, &quot;BeepMini&quot;]" /><summary type="html"><![CDATA[I was recently asked for a list of the games I have worked on over the years. That question sent me down a bit of a rabbit hole. I realised I don’t actually have a single list anywhere. Some of the games still exist online, some are tucked away on old hard drives, and some have quietly disappeared into the depths of the internet.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://www.binarymoon.co.uk/assets/images/binarymoon-giant-avatar.png" /><media:content medium="image" url="https://www.binarymoon.co.uk/assets/images/binarymoon-giant-avatar.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">I Spent Two Weeks Writing an Accessibility Report for Brush Ninja</title><link href="https://www.binarymoon.co.uk/writing/brush-ninja-accessibility/" rel="alternate" type="text/html" title="I Spent Two Weeks Writing an Accessibility Report for Brush Ninja" /><published>2025-11-06T00:00:00+00:00</published><updated>2025-11-06T00:00:00+00:00</updated><id>https://www.binarymoon.co.uk/writing/brush-ninja-accessibility</id><content type="html" xml:base="https://www.binarymoon.co.uk/writing/brush-ninja-accessibility/"><![CDATA[<p>A few weeks ago, someone emailed me asking if <a href="https://brush.ninja">Brush Ninja</a> had a VPAT. It didn’t. I also didn’t know where to start - but since a lot of schools use the app, I thought it was worth taking seriously.</p>

<p>For anyone new to the term (as I was), a <a href="https://www.itic.org/policy/accessibility/vpat"><strong>VPAT</strong> (Voluntary Product Accessibility Template)</a> is a document that describes how accessible a product is. It isn’t a pass or fail test - it’s guidance that helps people, like schools, decide if a tool/ website meets their accessibility needs.</p>

<h2 id="getting-started">Getting Started</h2>

<p>When I first opened the template, I’ll admit I felt overwhelmed. There were rows and rows of criteria, and I wasn’t sure how to tackle them. Eventually, I took a deep breath, made a hot chocolate, and started going through each one - slowly, methodically, one item at a time.</p>

<p>I’ve always tried to make Brush Ninja accessible, but I’d never done a proper audit. A lot of the answers were easy - things like <strong>Supports</strong> or <strong>Not Applicable</strong>. Others needed more attention.</p>

<p>Sometimes I could have ticked “Partial Support” and moved on, but I decided to fix the problems instead. If I was doing this, I wanted to do it properly.</p>

<h2 id="the-changes-i-made">The Changes I Made</h2>

<p>While working through the VPAT, I ended up improving quite a few things:</p>

<ul>
  <li><strong>Better focus styles.</strong> Making sure it’s always clear which part of the app is selected.</li>
  <li><strong>Accessible modals.</strong> The tab key now locks focus inside the modal and returns it to the button that opened it once closed.</li>
  <li><strong>Improved file uploads.</strong> They now look good, support drag and drop, and work with a keyboard. (CSS <code class="language-plaintext highlighter-rouge">:focus-within</code> was a lifesaver here.)</li>
  <li><strong>A rebuilt animation timeline.</strong> The keyboard focus order now makes sense, and the selected frame is obvious.</li>
  <li><strong>Added Captions to all user animations.</strong> The <a href="https://brush.ninja/gallery/animations/">Brush Ninja gallery</a> is controlled by me, I download videos from social media and re-upload them to the gallery. I went through and added descriptions of the animations to every one.</li>
  <li><strong>Skip Navigation Link.</strong> A hidden link at the top of the page that becomes visible when focused. I used to add these in WordPress themes, they allow keyboard users to skip straight to the main content.</li>
</ul>

<p>None of these were huge changes on their own, but together they made the app feel smoother and more consistent - not just for accessibility, but for everyone.</p>

<p>I have now made a public accessibility statement for Brush Ninja which you can read on the <a href="https://brush.ninja/accessibility/">Accessibility page</a>. You can also download the full VPAT document there if you’re interested in the details.</p>

<h2 id="reflections">Reflections</h2>

<p>Writing the VPAT was a really useful exercise. It forced me to look at Brush Ninja with fresh eyes and consider details I’d taken for granted.</p>

<p>I’ve also learned a lot about accessibility best practices along the way. Things like ARIA roles, semantic HTML, and keyboard navigation are now much clearer to me.</p>

<h2 id="why-it-matters">Why It Matters</h2>

<p>Accessibility isn’t just about ticking boxes. It’s about making sure that anyone - whether they use a mouse, a keyboard, or a screen reader - can create something. I’ve long understood that accessibility is important and not just for people with sight deficencies. Motor impairments, cognitive differences, and temporary disabilities/ impairments all play a role in how people interact with technology.</p>

<p>Brush Ninja is used by classrooms all over the world. If this work helps even one more student express themselves, it’s worth every minute.</p>

<h2 id="resources">Resources</h2>

<p>If you’re thinking about doing your own accessibility review, these tools helped me a lot:</p>

<ul>
  <li><strong><a href="https://wave.webaim.org/">WAVE Evaluation Tool</a></strong> – a quick, visual way to spot common accessibility issues.</li>
  <li><strong><a href="https://www.deque.com/axe/devtools/">Axe DevTools</a></strong> – a browser extension that finds more detailed WCAG problems and gives clear suggestions for fixes.</li>
</ul>

<p>Both are great starting points if you’re new to accessibility audits - and just trying to get these scores as high as possible will make a big difference.</p>]]></content><author><name>Ben Gillbanks</name></author><category term="Web Design" /><category term="Brush Ninja" /><summary type="html"><![CDATA[A few weeks ago, someone emailed me asking if Brush Ninja had a VPAT. It didn’t. I also didn’t know where to start - but since a lot of schools use the app, I thought it was worth taking seriously.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://www.binarymoon.co.uk/assets/images/binarymoon-giant-avatar.png" /><media:content medium="image" url="https://www.binarymoon.co.uk/assets/images/binarymoon-giant-avatar.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Playing with Particle Flow Fields</title><link href="https://www.binarymoon.co.uk/writing/particle-flow-fields/" rel="alternate" type="text/html" title="Playing with Particle Flow Fields" /><published>2025-09-18T00:00:00+01:00</published><updated>2025-09-18T00:00:00+01:00</updated><id>https://www.binarymoon.co.uk/writing/particle-flow-fields</id><content type="html" xml:base="https://www.binarymoon.co.uk/writing/particle-flow-fields/"><![CDATA[<p>I’ve been working on a new little side project: a <strong>Particle Flow Fields app</strong>. It’s a tool where you can watch particles drift around in invisible currents, like dust in the wind. The “wind” comes from simple maths formulas that describe how particles should move in the x and y directions.</p>

<figure class="m-b3"><a href="/wp-content/uploads/2025/particle-flow-1.png" class="display-block"><img class="b-br1 display-block m-auto" src="/cache/resize/d35b7655-particle-flow-1-800x2000-g.webp" alt="*" loading="lazy" width="800" height="450" /></a>
</figure>

<p>Each preset in the app is just two equations, but the results can be surprisingly complex. Some look smooth and wavy, while others spiral or scatter into chaotic patterns. I’ve included a mix of classic attractors (like Lorenz, Clifford, De Jong, Henon, and Ikeda) along with more experimental flows. They’re not mathematically exact — more like artistic remixes of the originals — but they capture the same flavour of chaos.</p>

<figure class="m-b3"><a href="/wp-content/uploads/2025/particle-flow-2.png" class="display-block"><img class="b-br1 display-block m-auto" src="/cache/resize/49d29bcb-particle-flow-2-800x2000-g.webp" alt="*" loading="lazy" width="800" height="450" /></a>
</figure>

<p>The fun part is that you can also <strong>write your own formulas</strong>. By combining <code class="language-plaintext highlighter-rouge">x</code>, <code class="language-plaintext highlighter-rouge">y</code>, and <code class="language-plaintext highlighter-rouge">t</code> with functions like <code class="language-plaintext highlighter-rouge">Math.sin()</code>, <code class="language-plaintext highlighter-rouge">Math.cos()</code>, and <code class="language-plaintext highlighter-rouge">Math.hypot()</code>, you can invent new flow fields and instantly see how particles behave. A few tweaks can completely change the feel of the system, from gentle waves to violent storms.</p>

<figure class="m-b3"><a href="/wp-content/uploads/2025/particle-flow-3.png" class="display-block"><img class="b-br1 display-block m-auto" src="/cache/resize/4f3d6bc8-particle-flow-3-800x2000-g.webp" alt="*" loading="lazy" width="800" height="450" /></a>
</figure>

<p>You can try it out here: <a href="https://brush.ninja/play/particle-flow-field/">Particle Flow Fields</a></p>

<p>This project sits alongside my other experiments like <strong>beep8</strong>, a retro game engine, and of course <strong>Brush Ninja</strong>. They’re all part of me exploring the space between creativity, code, and play.</p>

<figure class="m-b3"><a href="/wp-content/uploads/2025/particle-flow-4.png" class="display-block"><img class="b-br1 display-block m-auto" src="/cache/resize/794c307a-particle-flow-4-800x2000-g.webp" alt="*" loading="lazy" width="800" height="450" /></a>
</figure>]]></content><author><name>Ben Gillbanks</name></author><category term="BeepMini" /><category term="Brush Ninja" /><summary type="html"><![CDATA[I’ve been working on a new little side project: a Particle Flow Fields app. It’s a tool where you can watch particles drift around in invisible currents, like dust in the wind. The “wind” comes from simple maths formulas that describe how particles should move in the x and y directions.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://www.binarymoon.co.uk/assets/images/binarymoon-giant-avatar.png" /><media:content medium="image" url="https://www.binarymoon.co.uk/assets/images/binarymoon-giant-avatar.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Prime Time: Anti-capitalist game jam entry</title><link href="https://www.binarymoon.co.uk/writing/prime-time-anti-capitalist-game-jam-entry/" rel="alternate" type="text/html" title="Prime Time: Anti-capitalist game jam entry" /><published>2025-06-01T10:51:19+01:00</published><updated>2025-06-01T10:51:19+01:00</updated><id>https://www.binarymoon.co.uk/writing/prime-time-anti-capitalist-game-jam-entry</id><content type="html" xml:base="https://www.binarymoon.co.uk/writing/prime-time-anti-capitalist-game-jam-entry/"><![CDATA[<p>For the past couple of weeks, I’ve been building <a href="https://binarymoon.itch.io/prime-time"><strong>Prime Time</strong></a> for the F*ck Capitalism game jam. I wanted to make a simple idle game with a message, using my own game library, <a href="https://beep8.com/">beep8</a>.</p>

<p>Idle games are quick to prototype and easy to expand. I haven’t made one before, so I wanted to see how it worked. I kept it basic - no endless upgrade layers or complicated mechanics. I even kept the clicking to a minimum. Mostly you buy workers and upgrades and watch the numbers go up.</p>

<p>Satire felt right for an anti-capitalist theme. So in Prime Time, you play as “Geoff Bozo,” whose only goal is to become the richest person alive and blast off into space. It’s a direct poke at real-world billionaires chasing status while the world burns.</p>

<figure class="m-b3"><a href="/wp-content/uploads/2025/prime-time-intro.png" class="display-block"><img class="b-br1 display-block m-auto" src="/wp-content/uploads/2025/prime-time-intro.png" alt="Prime Time Intro. Geoff Bozo is saying: I'm Geoff Bozo. I need infinite money. Burn the rulebook. You'll make it happen!" loading="lazy" width="960" height="1200" /></a>
	<figcaption class="m0 m-t2"><p>Prime Time Intro. Geoff Bozo is saying: I’m Geoff Bozo. I need infinite money. Burn the rulebook. You’ll make it happen!</p>
</figcaption>
	
</figure>

<h2 id="tools-and-art">Tools and Art</h2>

<p>I created all graphics with my beep8 textmode editor, which I <a href="https://beep8.com/tools/beep8-textmode-editor/">recently released online</a>. It’s minimal but effective for retro projects like this.</p>

<figure class="m-b3"><a href="/wp-content/uploads/2025/beep8-level-editor.png" class="display-block"><img class="b-br1 display-block m-auto" src="/cache/resize/289a2769-beep8-level-editor-800x2000-g.webp" alt="The beep8 image editor" loading="lazy" width="800" height="631" /></a>
	<figcaption class="m0 m-t2"><p>The beep8 image editor</p>
</figcaption>
	
</figure>

<p>I’ve been really pleased with the feedback however some players said the news ticker was hard to read, so below I’ve included all the ticker and upgrade messages from the game so you can ‘enjoy’ them at your leisure.</p>

<figure class="m-b3"><a href="/wp-content/uploads/2025/prime-time-upgrades.png" class="display-block"><img class="b-br1 display-block m-auto" src="/wp-content/uploads/2025/prime-time-upgrades.png" alt="The upgrades screen showing some upgrades, and with the news ticker at the bottom" loading="lazy" width="960" height="1200" /></a>
	<figcaption class="m0 m-t2"><p>The upgrades screen showing some upgrades, and with the news ticker at the bottom</p>
</figcaption>
	
</figure>

<h2 id="news-ticker-messages">News Ticker Messages</h2>

<p>These message scroll across the bottom of the screen in Prime Time, simulating a news ticker. I wanted the messages to sound like real headlines whilst being darkly amusing &amp; exaggerated.</p>

<ul>
  <li>Productivity hits record high. Workers celebrate with 3-minute break</li>
  <li>BozoCorp achieves net-zero… ethics</li>
  <li>New AI tool replaces entire HR department. Nobody notices</li>
  <li>CEO pay rises 300%. Morale considered stable</li>
  <li>Customers demand faster shipping. CEO demands faster universe</li>
  <li>Investors thrilled as worker rights hit all-time low</li>
  <li>Company announces new strategy: Do More With Less Humanity</li>
  <li>All-hands meeting replaced with motivational email</li>
  <li>BozoCorp expands into sleep. Dreams now monetised</li>
  <li>Massive profits reported. Trickles of gratitude sent to staff</li>
  <li>Bozo announces plan to deliver dreams directly to your sleep</li>
  <li>Quantum server farm goes online. Time and space monetised</li>
  <li>New app lets users subscribe to basic human rights</li>
  <li>Now accepting organs as Prime Points</li>
  <li>Same-hour delivery coming soon. Retroactively</li>
  <li>Drone fleet upgraded with passive-aggressive voice alerts</li>
  <li>Fresh air now available as a subscription add-on</li>
  <li>Virtual shopping mall opens. Real world quietly dissolves</li>
  <li>AI therapist recommends shopping to improve mood</li>
  <li>Instant groceries now ordered directly by your fridge</li>
  <li>100’s of local businesses close. BozoCorp expands into ‘local’ delivery</li>
  <li>Independant bookstore closes. BozoCorp opens ‘Bozo’s Book Nook’</li>
  <li>Toy shops close down citing ‘Bozo’s Toyland’ as competition</li>
  <li>BozoCorp announces new supermarket with no staff. Just you and the shelves</li>
  <li>BozoCorp purchases Brazil to use the rainforests for packaging material</li>
  <li>BREAKING: Worldwide pandemic. BozoCorp profits increase 500%. Geoff Bozo celebrates with a bigger yacht.</li>
  <li>BozoCorp announces new record. 2 days without a workplace injury and 5 days without a death</li>
  <li>Bozo announces new plan to buy the NRA. ‘We need to protect our interests’</li>
  <li>BozoCorp starts charging employees for parking</li>
  <li>In shock move BozoCorp moves all manufacturing and shipping to China</li>
  <li>To celebrate becoming a trillionaire Bozo has bought a private cruise ship</li>
  <li>BozoCorp opens first school. Free to everyone with a BozoCorp platinum subscription</li>
  <li>Everything is fine. Keep clicking</li>
  <li>Buy more. Smile more. Think less</li>
  <li>Your convenience is our excuse</li>
  <li>Trust the algorithm. It knows what you want</li>
  <li>You are the product, and business is booming</li>
  <li>Don’t forget to rate your surveillance experience</li>
  <li>Your loyalty is deeply appreciated… and tracked</li>
  <li>Remember: You asked for this</li>
  <li>Freedom is a premium feature</li>
  <li>Every click brings you closer to fulfilment</li>
  <li>Bozo announces new initiative: ‘Project Happiness’</li>
  <li>Weather: cloud storage with a chance of data leaks</li>
  <li>Bozo named Person of the Millennium by BozoCorp</li>
  <li>Warehouse 2 breaks record for most unpaid overtime</li>
  <li>New emoji added to express consumer loyalty</li>
  <li>New flavour of energy paste: compliance</li>
  <li>BozoCorp wins award for fastest apology deletion</li>
  <li>Analysts agree: numbers good</li>
  <li>Upgrade now to unlock the illusion of progress</li>
  <li>Please stand by for strategic synergy</li>
  <li>Congratulations! You are this month’s ideal consumer</li>
  <li>BozoCorp hacked. Data leaked. Bozo tells staff to ignore it and carry on</li>
  <li>President Flump declares every Friday ‘Bozo Appreciation Day’</li>
  <li>Flump signs executive order banning bathroom breaks in fulfilment centres</li>
  <li>President Flump tweets: ‘Bozo is the BEST. So rich. So smart. So handsome and strong.’</li>
  <li>Flump appoints Bozo as Secretary of Speed. No one knows what that means</li>
  <li>White House buys 10 million ‘Prime Patriot’ hats. Manufactured offshore</li>
  <li>Flump calls press conference to announce ‘Books are back. Only Bozo books.’</li>
  <li>President Flump claims unions are a hoax made up by ‘angry librarians.’</li>
  <li>New government task force launched: Committee for Infinite Growth (CIG)</li>
  <li>Flump reduces taxes for billionaires. Claims it’s ‘for the little guy.’</li>
  <li>Flump announces new initiative: ‘Billionaire Bonanza’</li>
  <li>Flump’s new policy: ‘More profits, less regulations.’</li>
  <li>Flump tweets: ‘I love Bozo. He’s the best. I’m the best. We’re all the best.’</li>
  <li>President Flump’s new slogan: ‘Make America Click Again’</li>
  <li>President Flump’s new book: ‘The art of the steal’</li>
  <li>Flump repeals anti-competition laws. Claims it’s ‘best for everyone.’</li>
  <li>Flump says BozoCorp is a ‘monopoly of awesomeness.’</li>
  <li>New Tax year. BozoCorp reveals they paid $0 in taxes</li>
  <li>Flump and Bozo seen together enjoying a greasy burger on the Whitehouse lawn</li>
  <li>Bozo gifts President Flump a rocketship for his record third term as president</li>
  <li>Felon Muck crashes rocket, blames gravity for ‘not being innovative enough’</li>
  <li>Muck’s social network rolls out ‘Pay to Post’ feature. Immediately breaks</li>
  <li>Felon Muck unveils new Nesla car: now 80% screens, 20% glue</li>
  <li>Bozo and Muck announce joint venture: ‘SkyMall 2.0 - This Time It’s Personal’</li>
  <li>Felon tweets: ‘Just vibing with Bozo. Thinking of merging our empires. Thoughts?’</li>
  <li>Muck declares free speech dead, unless you’re verified and paying</li>
  <li>Nesla update adds horn that tweets your location in real time</li>
  <li>Felon starts digging tunnel under fulfilment centre. ‘For fun’, he says</li>
  <li>Felon claims his brain chip can increase click rates by 300%</li>
  <li>Bozo and Muck spotted at summit titled ‘Monetising the Human Condition’</li>
  <li>Nesla recalled over fear of spontaneous combustion. Muck blames ‘bad vibes’</li>
  <li>Muck’s new book: ‘How to Lose Friends and Alienate People’</li>
  <li>Muck celebrates first batch of delivery drones. Says it will cut 1000’s of jobs</li>
  <li>Muck announces new car design: ‘The Model Z - Zero Ethics, Zero Regrets’</li>
  <li>Felon Muck has to recall the upcoming Model Z because it doesn’t have any brakes</li>
</ul>

<h2 id="upgrade-messages">Upgrade Messages</h2>

<p>The upgrades in the game are used to improve your business. To finish the game you have to buy them all, whether you like it or not. Of course you could make a friendly sustainable business and just hire loads of people. It’s slower but eventually you’d earn the same money.</p>

<p>The upgrades start off relatively harmless, the same sorts of things any business might consider. But as you progress they become more and more ridiculous, poking fun at the extremes of capitalism and the lengths some companies will go to in the name of profit.</p>

<ul>
  <li>Improve marketing</li>
  <li>Streamline packaging</li>
  <li>Hire junior accountant</li>
  <li>Hire senior accountant</li>
  <li>Introduce next-day delivery</li>
  <li>Open second warehouse</li>
  <li>Launch mobile app</li>
  <li>Use zero-hour contracts</li>
  <li>Upgrade servers</li>
  <li>Offer loyalty points</li>
  <li>Auto-sorting conveyor belts</li>
  <li>Expand product range</li>
  <li>Partner with military drones</li>
  <li>Introduce 16-hour shifts</li>
  <li>Introduce motivational posters</li>
  <li>Replace chairs with standing desks</li>
  <li>Hire social media intern</li>
  <li>Cancel DEI program</li>
  <li>Launch a podcast</li>
  <li>Install vending machines full of caffeine</li>
  <li>Time bathroom breaks</li>
  <li>Introduce productivity scorecards</li>
  <li>Remove sick leave</li>
  <li>Cancel pensions</li>
  <li>Gamify performance</li>
  <li>Fire lowest performer weekly</li>
  <li>Offer unpaid internships</li>
  <li>Outsource support overseas</li>
  <li>Sell customer data</li>
  <li>Mandatory overtime</li>
  <li>Open tax-free offshore entity</li>
  <li>Install keyloggers</li>
  <li>Hire morale officer</li>
  <li>Rename “staff” to “resources”</li>
  <li>Offer “voluntary” weekend shifts</li>
  <li>Buy competitor out</li>
  <li>Rename firings as “optimisations”</li>
  <li>Cut warehouse heating</li>
  <li>Replace HR with AI</li>
  <li>Sponsor political candidate</li>
  <li>Ban unions</li>
  <li>Fund anti-union propaganda</li>
  <li>Fire whistleblowers</li>
  <li>Replace workers with robots</li>
  <li>Monitor bathroom use</li>
  <li>Fine for late arrivals</li>
  <li>Use free prison labour</li>
  <li>Charge rent for locker use</li>
  <li>Lobby to deregulate safety</li>
  <li>Sell employee data</li>
  <li>Create fake worker reviews</li>
  <li>Gamify union-busting</li>
  <li>Install “Efficiency Drones”</li>
  <li>Create “wellness” programme</li>
  <li>Buy surveillance startup</li>
  <li>Build “smile or be fired” app</li>
  <li>Buy a news network</li>
  <li>Sell climate denial ads</li>
  <li>Move HQ to international waters</li>
  <li>Ban breaks via lobby loophole</li>
  <li>Run Squid Game event to boost productivity</li>
  <li>Run greenwashing campaign</li>
  <li>Start religion based on Bozo</li>
  <li>Open branded school</li>
  <li>Mine moon for profit</li>
  <li>Buy oxygen rights</li>
  <li>Use AI to auto-fire staff</li>
  <li>Charge for emotional support</li>
  <li>Monetise dreams</li>
  <li>Require company tattoos</li>
  <li>Launch BozoCoin</li>
  <li>Ban crying in warehouses</li>
  <li>Monetise time off</li>
  <li>Replace all remote workers with chatbots</li>
  <li>Start interplanetary tax shelter</li>
  <li>Lobby for Mars to be Bozo-only</li>
  <li>Create Bozo NFTs</li>
  <li>Erase worker memories daily</li>
  <li>Escape Earth in rocket ship</li>
</ul>

<h2 id="prime-fun">Prime Fun?</h2>

<p>Prime Time was a quick project with the goal to poke fun at billionaire worship while highlighting real issues with modern capitalism. If you want to check out <a href="https://beep8.com/">beep8</a> or <a href="https://binarymoon.itch.io/prime-time">play Prime Time yourself</a>, you can find both online.</p>

<p>Amazon could pay workers more and still be wildly profitable - they choose not to.</p>

<figure class="m-b3"><a href="/wp-content/uploads/2025/prime-time-store-categories.png" class="display-block"><img class="b-br1 display-block m-auto" src="/wp-content/uploads/2025/prime-time-store-categories.png" alt="The store screen showing the different categories and their progress with making their products" loading="lazy" width="960" height="1200" /></a>
	<figcaption class="m0 m-t2"><p>The store screen showing the different categories and their progress with making their products</p>
</figcaption>
	
</figure>]]></content><author><name>Ben Gillbanks</name></author><category term="BeepMini" /><category term="Business" /><category term="Video Games" /><summary type="html"><![CDATA[For the past couple of weeks, I’ve been building Prime Time for the F*ck Capitalism game jam. I wanted to make a simple idle game with a message, using my own game library, beep8.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://www.binarymoon.co.uk/assets/images/binarymoon-giant-avatar.png" /><media:content medium="image" url="https://www.binarymoon.co.uk/assets/images/binarymoon-giant-avatar.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Private, Fast, Social Sharing Links</title><link href="https://www.binarymoon.co.uk/writing/social-sharing-links/" rel="alternate" type="text/html" title="Private, Fast, Social Sharing Links" /><published>2025-05-06T06:58:03+01:00</published><updated>2025-05-06T06:58:03+01:00</updated><id>https://www.binarymoon.co.uk/writing/social-sharing-links</id><content type="html" xml:base="https://www.binarymoon.co.uk/writing/social-sharing-links/"><![CDATA[<p>Social sharing links used to be everywhere. Blogs and news sites loved them. You’d see buttons for Facebook, Twitter, Pinterest, and more on every article.</p>

<p>But these sharing tools had problems. They loaded lots of scripts from different social networks. That slowed down pages and sometimes broke things. Worse, they could be used to track users and shared data without consent.</p>

<p>Now, most people skip these bloated widgets. In fact, many sites just don’t bother with social sharing links at all.</p>

<h2 id="static-social-sharing-links">Static Social Sharing Links</h2>

<p>There’s an alternative: static sharing links. These are simple URLs that point to a social network and prefill the post content or link you want to share.</p>

<p>These links don’t load extra scripts or track users. They’re fast and safe because they open a network’s share page directly.</p>

<p>For example, here’s a plain Twitter sharing link:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>https://twitter.com/intent/tweet?text=Check+out+this+article&amp;url=https://example.com
</code></pre></div></div>

<p>When someone clicks this, Twitter opens with the message ready to send.</p>

<p>« image prompt: “A simple web page with static social sharing links (Twitter, Facebook, LinkedIn) shown as text links” »</p>

<h2 id="supported-parameters-by-network">Supported Parameters by Network</h2>

<p>Most major networks support some kind of static sharing link. Below are the ones I have found and used:</p>

<ul>
  <li>Bluesky: https://bsky.app/intent/compose?text=TEXT</li>
  <li>Reddit: https://www.reddit.com/submit?url=URL&amp;title=TITLE&amp;type=LINK</li>
  <li>Mastodon: https://toot.kytta.dev/?text=TEXT (Uses a third party service)</li>
  <li>Facebook: https://www.facebook.com/sharer/sharer.php?u=URL</li>
  <li>LinkedIn: https://www.linkedin.com/shareArticle?mini=true&amp;url=URL&amp;title=TITLE</li>
  <li><del>Twitter/ X: https://twitter.com/intent/tweet?text=TEXT&amp;url=URL&amp;via=USERNAME</del></li>
</ul>

<h2 id="why-use-static-sharing-links">Why Use Static Sharing Links?</h2>

<p>Static social sharing links let users share your content quickly without tracking or slowing down your site. They’re easy to add - just a regular HTML link.</p>

<p>Few sites use them now, but they’re worth considering if you care about privacy and speed. You keep control over what loads on your pages, and your readers get a better experience.</p>

<p>If you’re looking for lightweight, private ways to let people share your content, try adding static social sharing links.</p>]]></content><author><name>Ben Gillbanks</name></author><category term="Web Design" /><summary type="html"><![CDATA[Social sharing links used to be everywhere. Blogs and news sites loved them. You’d see buttons for Facebook, Twitter, Pinterest, and more on every article.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://www.binarymoon.co.uk/assets/images/binarymoon-giant-avatar.png" /><media:content medium="image" url="https://www.binarymoon.co.uk/assets/images/binarymoon-giant-avatar.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Beep8 and BeepMini – a Retro Games Library</title><link href="https://www.binarymoon.co.uk/writing/beep8-and-beepmini-a-retro-games-library/" rel="alternate" type="text/html" title="Beep8 and BeepMini – a Retro Games Library" /><published>2025-04-28T23:11:50+01:00</published><updated>2025-04-28T23:11:50+01:00</updated><id>https://www.binarymoon.co.uk/writing/beep8-and-beepmini-a-retro-games-library</id><content type="html" xml:base="https://www.binarymoon.co.uk/writing/beep8-and-beepmini-a-retro-games-library/"><![CDATA[<p>I’ve always had a soft spot for retro games. Born in the 80s, I was lucky enough to be raised on them—though they weren’t retro at the time. For a while now, I’ve wanted to build something that makes rapid game creation easy. At first, I imagined a Mario Maker-style tool, but the more I thought about it, the more I realised I needed a solid game engine to build on top of. So, I decided to create an open-source retro games library, inspired by fantasy consoles like <a href="https://pico-8.com">Pico-8</a>.</p>

<figure class="m-b3"><a href="/wp-content/uploads/2025/beep8-chomper.png" class="display-block"><img class="b-br1 display-block m-auto" src="/cache/resize/2ab43595-beep8-chomper-800x2000-g.webp" alt="A screenshot of my game Chomper, a Pacman inspired game with skeletons chasing a blob that just wants to eat all the dots." loading="lazy" width="800" height="1000" /></a>
	<figcaption class="m0 m-t2"><p>A screenshot of my game Chomper, a Pacman inspired game with skeletons chasing a blob that just wants to eat all the dots.</p>
</figcaption>
	
</figure>

<p>I’m always on the lookout for interesting projects, and last year I stumbled across <a href="https://github.com/btco/qx82">QX82</a>, a fantastic open-source JavaScript library. It did a lot of what I needed, but the structure didn’t quite match my style. So, I forked it and started turning it into something of my own—and that’s how <a href="https://beep8.com">Beep8</a> was born.</p>

<p>What drew me to QX82 was its use of textmode graphics, using a black-and-white tileset to build visuals. The graphics are loaded once and then recoloured so each tile has a foreground and background colour. This gives loads of flexibility with very few assets. It also creates a natural retro feel, thanks to the limited colours and chunky tiles. I also loved the idea of making games with only built-in assets—no need to create custom artwork (despite being a designer). That meant I could focus purely on gameplay.</p>

<p>One of my early changes was adding support for flexible pixel tiles, so Beep8 could be used for all sorts of games. I was inspired by artists like <a href="https://mrmotarius.itch.io/moregoblins">MrMo Tarius</a>, <a href="https://batfeula.itch.io/chunky">Batfeula</a>, and others. I wanted tiles that would work in many different settings—platformers, puzzle games, dungeon crawlers, whatever.</p>

<figure class="m-b3"><a href="/wp-content/uploads/2025/beep8-crate-crew.png" class="display-block"><img class="b-br1 display-block m-auto" src="/cache/resize/82b9e954-beep8-crate-crew-800x2000-g.webp" alt="A screenshot of Crate Crew, a crate pushing game where you control from 1 to 4 different characters trying to organise the warehouse." loading="lazy" width="800" height="1000" /></a>
	<figcaption class="m0 m-t2"><p>A screenshot of Crate Crew, a crate pushing game where you control from 1 to 4 different characters trying to organise the warehouse.</p>
</figcaption>
	
</figure>

<p>While digging around online, I also found <a href="https://en.wikipedia.org/wiki/ABA_Games">Kenta Cho’s (ABA Games)</a> minimalist library, <a href="https://github.com/abagames/crisp-game-lib">Crisp</a>. Kenta is well known in indie circles for his stripped-back, fast-paced shooters—especially <em>TUMIKI Fighters</em>. Crisp is written in JavaScript and designed to make games with minimal effort. Title screens, music, sound effects—it’s all baked in, with no external assets. I loved that approach and wanted something similar for Beep8.</p>

<p>A big part of the project has been the tilemap editor and loader I built. Drawing and loading elements is now both fast and fun. These tools will be available to everyone eventually.</p>

<figure class="m-b3"><a href="/wp-content/uploads/2025/beep8-level-editor.png" class="display-block"><img class="b-br1 display-block m-auto" src="/cache/resize/289a2769-beep8-level-editor-800x2000-g.webp" alt="A screenshot of the Beep8 level editor/ graphic editor tool showing the tools and tiles on the left, and what has been drawn on the right." loading="lazy" width="800" height="631" /></a>
	<figcaption class="m0 m-t2"><p>A screenshot of the Beep8 level editor/ graphic editor tool showing the tools and tiles on the left, and what has been drawn on the right.</p>
</figcaption>
	
</figure>

<p>I also wanted a games arcade—a home for my <a href="https://beep8.com">beep8.com</a> creations. Inspired by last year’s release of <a href="https://store.steampowered.com/app/1147860/UFO_50/">UFO50</a>, I thought it’d be fun to “find” an old console and restore its games so others could play them on modern hardware. That led to <a href="https://beepmini.com">BeepMini</a>. I found the console in my grandfather’s attic and have been restoring games ever since.</p>

<figure class="m-b3"><a href="/wp-content/uploads/2025/beep8-tumble.png" class="display-block"><img class="b-br1 display-block m-auto" src="/cache/resize/db1bc1a1-beep8-tumble-800x2000-g.webp" alt="A screenshot of my game Tumble, a heavy debt is owed to Tetris for the inspiration." loading="lazy" width="800" height="1000" /></a>
	<figcaption class="m0 m-t2"><p>A screenshot of my game Tumble, a heavy debt is owed to Tetris for the inspiration.</p>
</figcaption>
	
</figure>

<p>I’m loving working on Beep8 and BeepMini—I haven’t felt this inspired since I first started building <a href="https://brush.ninja">Brush Ninja</a>.</p>

<p>If you’re curious or want to join the adventure, the <a href="https://github.com/BinaryMoon/Beep8/">Beep8 code is on GitHub</a>, the docs are at <a href="https://beep8.com">beep8.com</a>, and you can play some games at <a href="https://beepmini.com">beepmini.com</a>.</p>]]></content><author><name>Ben Gillbanks</name></author><category term="Web Design" /><category term="Business" /><category term="BeepMini" /><summary type="html"><![CDATA[I’ve always had a soft spot for retro games. Born in the 80s, I was lucky enough to be raised on them—though they weren’t retro at the time. For a while now, I’ve wanted to build something that makes rapid game creation easy. At first, I imagined a Mario Maker-style tool, but the more I thought about it, the more I realised I needed a solid game engine to build on top of. So, I decided to create an open-source retro games library, inspired by fantasy consoles like Pico-8.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://www.binarymoon.co.uk/assets/images/binarymoon-giant-avatar.png" /><media:content medium="image" url="https://www.binarymoon.co.uk/assets/images/binarymoon-giant-avatar.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">The UK’s AI Copyright Plan is a Disaster for Creators</title><link href="https://www.binarymoon.co.uk/writing/uk-copyright/" rel="alternate" type="text/html" title="The UK’s AI Copyright Plan is a Disaster for Creators" /><published>2025-02-14T09:30:30+00:00</published><updated>2025-02-14T09:30:30+00:00</updated><id>https://www.binarymoon.co.uk/writing/uk-copyright</id><content type="html" xml:base="https://www.binarymoon.co.uk/writing/uk-copyright/"><![CDATA[<p>The UK government is considering changes to copyright law that would allow AI companies to train their models on artists’ work without permission. This means that AI-generated images could be built using artwork taken from real artists without credit, payment, or consent.</p>

<p>As both a programmer and a hobbyist artist, I support AI, but I believe it should be developed ethically, respecting the rights of creators. That’s why I wrote to my MP to voice my concerns. Below is the email I sent, explaining why these changes would be harmful to the UK’s creative industry and what a fairer approach could look like.</p>

<section class="bg-gray1 p4">

  <p>My name is Ben, and I am a programmer and hobbyist artist. I am deeply concerned about the government’s recent suggestion to change copyright laws in a way that would allow AI models to be trained on artists’ work without their consent.</p>

  <p>As a programmer, I support AI and its potential, despite legitimate concerns about its environmental impact, which I believe will improve over time. However, I strongly object to the use of artists’ work in AI training without permission.</p>

  <p>An opt-out system is not a viable solution. Once an AI model has been trained on an artist’s work, it cannot “unlearn” it. The only way to remove such data would be to scrap the entire training set and start from scratch - something AI companies are highly unlikely to do.</p>

  <p>The UK government itself recognises that the UK’s creative industries are <a href="https://lordslibrary.parliament.uk/contribution-of-the-arts-to-society-and-the-economy/">worth over £124 billion</a>. This sector is a major driver of our economy, yet these proposed changes threaten to undermine it. We should be encouraging artists to continue creating, not allowing their work to be taken without consent so that others can profit from it for free.</p>

  <p>I love both art and technology and want to see them thrive, especially here in the UK. But this process is already harming creative jobs, and legalising it would only make things worse.</p>

  <p>I urge you to oppose these proposed changes. A simple solution would be to make participation opt-in rather than opt-out. Even better, AI companies could pay artists to create work specifically for training purposes. That way, we could support both technological progress and the creative industry.</p>

  <p>I appreciate your time and hope you will consider standing against these changes.</p>

  <p>Best regards, Ben</p>

</section>

<p>If you’re in the UK then please consider contacting your MP to voice your concerns. You can find their contact details on the <a href="https://members.parliament.uk/members/Commons">UK Parliament website</a>. Additionally, I encourage you to share this message with fellow creators to raise awareness about the importance of ethical AI development.</p>

<p>There is also a website signed by a large contingent of artists and creators, including many names you will recognise, that you can <a href="https://www.aitrainingstatement.org/">sign here</a>.</p>]]></content><author><name>Ben Gillbanks</name></author><category term="Random" /><summary type="html"><![CDATA[The UK government is considering changes to copyright law that would allow AI companies to train their models on artists’ work without permission. This means that AI-generated images could be built using artwork taken from real artists without credit, payment, or consent.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://www.binarymoon.co.uk/assets/images/binarymoon-giant-avatar.png" /><media:content medium="image" url="https://www.binarymoon.co.uk/assets/images/binarymoon-giant-avatar.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Explore Creativity with the Ninja Sparks Newsletter</title><link href="https://www.binarymoon.co.uk/writing/ninja-sparks-newsletter/" rel="alternate" type="text/html" title="Explore Creativity with the Ninja Sparks Newsletter" /><published>2025-01-16T22:52:30+00:00</published><updated>2025-01-16T22:52:30+00:00</updated><id>https://www.binarymoon.co.uk/writing/ninja-sparks-newsletter</id><content type="html" xml:base="https://www.binarymoon.co.uk/writing/ninja-sparks-newsletter/"><![CDATA[<style>
h1, article div > h2, h3 a {
	padding: 0.5rem 0;
	display: inline;
	background: #00f;
	color: white;
}
</style>

<p>For the past few years, I’ve been writing a monthly newsletter for <a href="https://brush.ninja">Brush Ninja</a>. It was alright, but something always felt off. I struggled with what to say and why I was saying it. Late last year, it all became too much. I decided I needed to shake things up and turn it into something new.</p>

<h2 id="a-fresh-focus">A Fresh Focus</h2>

<p>I mostly create side projects. Some of them catch on, like Brush Ninja, and become main projects. The internet is bursting with side projects that deserve more attention. We often get stuck in our website silos, just scrolling through social media and searching on Google without truly exploring.</p>

<p>Back in the 90s the web was a wild place. You could stumble upon all sorts of weird and unusual websites. There was even a website called StumbleUpon that helped you do just that.</p>

<p>And that’s when it hit me: I wanted to show that the web is still full of creativity and inspiration. Much like my side projects, there’s so much more out there waiting to be discovered.</p>

<h2 id="sharing-hidden-gems">Sharing Hidden Gems</h2>

<p>I’ve got a long list of apps and websites I’ve tried over the years. So every two weeks in the <a href="https://ninjasparks.com">Ninja Sparks</a> newsletter, I’ll share one app or website that stands out to me. Alongside that, I’ll include links to creative articles I’ve foudn and videos I’ve watched.</p>

<p>If these things resonate with me, then hopefully they’ll inspire you too.</p>

<h2 id="join-the-journey">Join the Journey</h2>

<p>Join me on this journey with <a href="https://ninjasparks.com">Ninja Sparks</a>. Discover creativity online that goes beyond the usual echo chambers. Let’s explore together and find those hidden gems that make the internet an exciting place again.</p>

<section class="bg-gray1 p4 d:p5 b-br2 newsletter ninja-sparks-newsletter flex flex-col font-monospace-code bg-image" style="--bg-image: url(https://ninjasparks.com/images/bg.png); background-repeat: no-repeat; background-position: top; background-size: 100%;">
	<h2 class="m0 f3"><img src="https://ninjasparks.com/images/icon/favicon.svg" class="float-l w3 p-r3" alt="" /> Join the Ninja Sparks Newsletter!</h2>
	<p class="m0">Get creative tools, inspiring ideas, and maker magic delivered to your inbox every two weeks.</p>
	<p class="m0 p-b3"><a href="https://ninjasparks.com/" class="f6 f-fw900 t-tt-u fg-blue-dark flex-g1">More about Ninja Sparks &rarr;</a></p>
	<div class="f3 newsletter-join">

	<form class="embeddable-buttondown-form m0 flex flex-ai-c flex-wrap gap0 p2 b-br2 b b2 b-black bg-gray3">
		<label for="bd-email">
			<span class="p2 display-none t:display-block"><img src="https://ninjasparks.com/images/icon/icon-email.svg" class="w2" alt="" /></span>
			<span class="screen-reader-text">Email address</span>
		</label>
		<input type="email" name="email" id="bd-email" placeholder="joe@example.com" class="f4 p2 bg-transparent b-none" style="margin: 0; color: white; flex-grow: 2; max-width: 100%; width: auto; background: transparent;" />

		<div class="flex flex-center p3" style="flex-grow: 1;">
			<input type="submit" value="Join &rarr;" class="f5 t-tt-u f-fw900 w100 bg-yellow m0" style="max-width: 100%;" />
		</div>
	</form>

	<small class="m-t2 display-block">By entering my email, I agree to receive the Ninja Sparks newsletter.</small>

</div>


<script>
	// Define once. Reuse if already present.
	window.nsInitNewsletter = window.nsInitNewsletter || function() {
		document.querySelectorAll( '.newsletter-join form:not([data-ns-bound])' ).forEach(
			( form ) => {

				form.setAttribute( 'data-ns-bound', '1' );
				form.setAttribute( 'data-start', Date.now() );

				// Add a JS-only honeypot
				if ( !form.querySelector( 'input[name="website"]' ) ) {

					const hp = document.createElement( 'input' );
					hp.type = 'text';
					hp.name = 'website'; // bots love this
					hp.tabIndex = -1;
					hp.autocomplete = 'off';
					hp.setAttribute( 'aria-hidden', 'true' );
					hp.setAttribute( 'hidden', 'true' );
					hp.style.position = 'absolute';
					hp.style.left = '-9999px';
					hp.style.opacity = '0';
					form.prepend( hp );

				}

				form.addEventListener(
					'submit',
					( e ) => {
						// Block obvious bots
						const hp = form.querySelector( 'input[name="website"]' );
						if ( hp && hp.value ) {
							e.preventDefault();
							return;
						}

						if ( Date.now() - parseInt( form.dataset.start ) < 1500 ) {
							e.preventDefault();
							return;
						}

						// Set real target and action just-in-time
						form.target = 'popupwindow';
						form.method = 'post';
						form.action = 'https://buttondown.com/api/emails/embed-subscribe/BrushNinja';

						// Open confirm window
						window.open( 'https://buttondown.com/BrushNinja', 'popupwindow' );
					}
				);
			}
		);
	};

	// Run now, and safe to call again from other includes
	if ( document.readyState === 'loading' ) {
		document.addEventListener( 'DOMContentLoaded', window.nsInitNewsletter );
	} else {
		window.nsInitNewsletter();
	}
</script>
</section>]]></content><author><name>Ben Gillbanks</name></author><category term="Web Design" /><category term="Business" /><summary type="html"><![CDATA[]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://www.binarymoon.co.uk/assets/images/binarymoon-giant-avatar.png" /><media:content medium="image" url="https://www.binarymoon.co.uk/assets/images/binarymoon-giant-avatar.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Enhance Your Website with my Free Embeddable Drawing App</title><link href="https://www.binarymoon.co.uk/writing/enhance-your-website-with-my-free-embeddable-drawing-app/" rel="alternate" type="text/html" title="Enhance Your Website with my Free Embeddable Drawing App" /><published>2024-05-22T14:04:13+01:00</published><updated>2024-05-22T14:04:13+01:00</updated><id>https://www.binarymoon.co.uk/writing/enhance-your-website-with-my-free-embeddable-drawing-app</id><content type="html" xml:base="https://www.binarymoon.co.uk/writing/enhance-your-website-with-my-free-embeddable-drawing-app/"><![CDATA[<p>Over on Brush Ninja I’ve been working on a free embeddable drawing app called <a href="https://brush.ninja/create/drawing/">Paint Ninja</a>. If you’ve ever used Procreate or the classic MS Paint from the ’90s, you’ll feel right at home with this.</p>

<h2 id="a-fun-creative-tool">A Fun Creative Tool</h2>

<p><a href="https://brush.ninja">Brush Ninja</a> has always been about creating fun and simple-to-use creative tools. Recently, I started developing a new drawing app. It’s basic but very free, just like the apps I used to create when I was learning to program.</p>

<p>Ever since I started programming, I’ve been making art apps. I remember trying to recreate MS Paint while learning Visual Basic in the ’90s. Later on, I’d make drawing apps in <a href="https://en.wikipedia.org/wiki/The_Game_Creators">DarkBASIC</a>, <a href="https://github.com/blitz-research/blitzplus_msvc2017">Blitz Plus</a> and Javascript. This new app is the culmination of all that knowledge and experience, and I think it’s a lot of fun.</p>

<h2 id="introducing-paint-ninja">Introducing Paint Ninja</h2>

<p>Last month, I took it a step further and made Paint Ninja embeddable. Now, anyone can embed it on their website for free! Imagine adding an interactive element to your site where users can draw directly on your page. It’s pretty cool!</p>

<h3 id="how-to-embed-paint-ninja">How to Embed Paint Ninja</h3>

<p>Embedding Paint Ninja on your website couldn’t be easier. Just copy and paste these two lines of code into your web page:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>&lt;script src="https://embed.brush.ninja/drawing.js"&gt;&lt;/script&gt;
&lt;brush-ninja-drawing&gt;&lt;/brush-ninja-drawing&gt;
</code></pre></div></div>

<p>That’s it! You’ll have a fully functional drawing app right on your site.</p>

<script src="https://embed.brush.ninja/drawing.js"></script>

<brush-ninja-drawing class="w100"></brush-ninja-drawing>

<h2 id="future-plans">Future Plans</h2>

<p>It’s still early days for the app, but I’m already thinking about future updates. The next major addition I want to make is layers. Adding layers will make Paint Ninja much more complex than MS Paint and will open up new possibilities for creativity.</p>

<p>However, I’m not sure when this update will happen. For now, I’d love to see how people use Paint Ninja on their websites. Feel free to share your thoughts and feedback with me on social media—links are below.</p>

<h2 id="share-your-thoughts">Share your thoughts</h2>

<p>I’d love to hear from you! Let me know if you embed Paint Ninja on your site and how you’re using it. Share your creations or any ideas you have for future updates.</p>]]></content><author><name>Ben Gillbanks</name></author><category term="Web Design" /><summary type="html"><![CDATA[Over on Brush Ninja I’ve been working on a free embeddable drawing app called Paint Ninja. If you’ve ever used Procreate or the classic MS Paint from the ’90s, you’ll feel right at home with this.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://www.binarymoon.co.uk/assets/images/binarymoon-giant-avatar.png" /><media:content medium="image" url="https://www.binarymoon.co.uk/assets/images/binarymoon-giant-avatar.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry></feed>