[2026]
I turned my DevTerm into a Game Boy Camera and Printer
The Game Boy Camera was brilliant and stupid in equal measure, a 128x112 pixel sensor bolted on top of a cartridge, printing to thermal paper on a Game Boy Printer…
Your forecast is accurate and still wrong
Icons work because they’re fast. One glance, immediate meaning, no reading required. The tradeoff is that they compress complex information into a single symbol, and compression always drops something.
It's 2026, why are vendor prefixes still in your CSS?
I’ve spent more time over the last 20 years working on front-end asset pipelines than I’d care to admit. One thing that kept coming up when inheriting older codebases was…
The DS Pico might be the last DS flashcart you'll ever need
In 2007 I was deep in the DS flashcart scene, cycling through a string of carts. GBATemp threads, firmware drama, custom skins, compatibility lists. By 2009 I’d moved on. Nearly…
Reducing commit log noise caused by a GitHub Action
I have a “now playing” widget on my /now page that shows the last track scrobbled to Last.fm. It’s powered by a GitHub Actions workflow that polls the Last.fm API…
Building a Home NAS from Mostly Spare Parts
I’ve had a SNUNMU GK3 mini-PC kicking about since early-2023, barely used. An impulse buy that ended up on a shelf, alongside a drawer full of old drives from various…
My phone's AI is screening your AI
I’ve been using Google’s Call Screening feature for a while now. I turned it on mostly to filter out calls from numbers I don’t recognise (I’ve signed up with TPS…
Archive Archaeology
I was talking to someone about foobar2000 and how prolific I’d been in the customisation scene back in the day. I knew I’d written up a detailed config somewhere, with…
Using emoji to bypass FRP on a decade-old tablet
I recently picked up two Pixel C tablets from a seller on eBay, along with the magnetic keyboard. One tablet had a cracked screen but worked fine and wasn’t locked….
Using split view in Chrome
Chrome’s split view tabs is one of those features that silently arrived and slipped into my workflow. I’ve found myself using it more and more over the past couple of…
Downgrading the OnePlus 7 Pro for LineageOS
I’ve had a OnePlus 7 Pro sitting in a drawer for a couple of years. I used it from 2019, found it too big, got a Pixel 5a, and now…
The LinYuvo KS42 Wireless Joycons for the Nintendo Switch
I’ve gone through a few sets of Joy-Cons since buying my Switch back in 2018. Every pair has ended up with stick drift, and at this point my Switch is…
Plugins instead of patches
I’ve been running Known as my social posting hub for a while now. It’s a solid IndieWeb-friendly CMS that handles status updates, photos, and syndication to various silos. Recently I…
The Bigme B6 Color E-Ink Tablet
I’ve owned plenty of Kindles and Android tablets over the years, but I’ve been curious about colour e-ink for a while - whether it’s actually useful or just a gimmick….
Why can't I read this picture book?
I’ve spent the last five years reading picture books with my kids at bedtime. Hundreds of them - and I’m still going, even as my eldest moves on to chapter…
Installing Android on the Nintendo Switch
A banned Switch sitting on a shelf is prime hardware for Android. Turns out the Tegra X1 that powered Breath of the Wild runs a full Android OS surprisingly well….
Building an emoji-only chat app
My daughter finds emoji hilarious. She’s 6 and will scroll through an emoji picker for ages. My wife and I started by letting her use WhatsApp’s emoji picker to send…
Moving to GitHub Actions (and adding .txt posts)
This year I moved the blog from GitHub Pages’ built-in Jekyll to a GitHub Actions workflow, then added .txt URL support for posts. Inspired by Terence Eden’s blog post about…
Building a Balatro-lite game with vanilla web tech
I’ve spent countless hours playing Balatro, and I’ve always wanted to create my own game with similar mechanics. When TrinketOS announced a game jam, it was the perfect excuse to…
[2025]
Exploring OTA firmware updates on the Mangmi Air X
After reviewing the Mangmi Air X, I got curious about how the firmware updates worked. Mangmi have been pushing updates fairly regularly, which is great to see on a budget…
The Mangmi Air X
Back in 2015 when I reviewed devices like the GPD XD and similar Android handhelds, the whole ecosystem felt half-baked. Emulation wasn’t particularly good yet, the devices came from obscure…
Replacing the macOS audio switcher with SwiftBar
The built-in audio output menu in macOS has always felt a bit limited. The icons aren’t very helpful, the device names can’t be customised, and if you’ve got a few…
[2023]
Pico-8 Cartridge Label for GPi Case
The end of Dingoonity
If you were familiar with Dingoonity, you might have noticed by now that I’ve made the decision to shut down the website.
The Movies I Watched in 2022
Through 2022 I kept track of most the movies I watched. In this post I’ll talk about how I took that data and, combined with the OMDb API, used the…
[2022]
Using a Raspberry Pi to Host a local Visual Studio Code Server
I tend to work on this blog from multiple machines in my home. These include a desktop PC running Windows, a MacBook Pro running macOS, and a Chromebook with the…
A Bit of a Bodge To Make MASSIVE Emoji
I’ve been fiddling with an instance of Known over on social.omgmog.net. As part of my fiddling I’ve been trying out some of the plugins for Known. I came across the…
Installing Chrome OS on a Late 2009 MacBook
I’ve got an old 2009 MacBook 6,1 (A1342) kicking about in my office that I’ve been playing with on and off lately.
Adding support for Webmentions
I’ve added Webmention support to the posts on this blog. Webmentions are a method for websites to know that they’ve been linked to (or mentioned) from elsewhere on the web….
DevTerm Stuff
I helped crowdfund the DevTerm from ClockworkPi back in November 2020 and it arrived in January 2022. It’s a nice device, but it’s not perfect. Here’s some of the mods…
The Inevitable Oculus Quest Post
I sold my HTC Vive back in 2020 and bought an Oculus Quest. Was it an impulsive lockdown treat? Perhaps; but it was time for an upgrade. I went for…
[2021]
Adding an internal speaker to the Pocket CHIP
The Pocket CHIP doesn’t come with internal speakers. It has the GPIO pins for audio, but nothing is hooked up. On the CHIP itself there is a 3.5mm audio jack…
Adding Global Volume Control to the Pocket CHIP
I’ve been gradually adding internal speakers to each of my Pocket CHIPs lately and found it cumbersome to have to either open alsamixer or use the volume control page in…
GameShell Stuff
I bought a ClockworkPi GameShell back in October 2019. I’ve been playing with it a bit lately (in anticipation of the ClockworkPi DevTerm shipping!) and I realised I haven’t yet…
The Raspberry Pi Pico and the Pimoroni Pico RGB Keypad
In January the Raspberry Pi Pico was announced. The Pico is a RP2040 microcontroller featuring a dual-core Arm Cortex-M0+ processor with 264KB internal RAM and support for up to 16MB…
CHIP Stuff
This page is a changing document. I’ll probably add more notes to it in the future. These are just some notes that I’ve put together in the past about flashing…
Using ORCA with FluidSynth on the Pocket CHIP
This post is about using the ORCA livecoding playground on the Pocket CHIP From the ORCA wiki: Orca is a two-dimensional esoteric programming language in which every letter of the…
[2020]
[2019]
Installing Ubuntu on MacBookPro 8,2
Pico-8 on the Raspberry Pi with Game HAT
I’ve been playing with Pico-8 a lot lately. I’ve got a small Pico-8 project site to launch soon, but in the mean time I’m more occupied with getting Pico-8 running…
Approaches for a simple state system
Outlining text and sprites
[2018]
Some Notes About Android Virtual Devices
A custom font
A Foray Into Home Automation
A Dialog System
Pocket Sprite Laptop Mount
Extra small extra macro keys v2.0
Extra small extra macro keys v1.0
New Printer Standoffs and a Rebuild
Shower Bracket Spacer
New Filament!
An Audio Amp v2.0
Kitchen Tongs Spacer
An Audio Amp v1.0
3D Printing a new remote control
New Filament!
What's in the box?
LED Lighting and a Kill Switch
Recycled Parts
[2017]
Merry Grootmas
Is this art?
My Birthday and Problems Printing Spidey
Xenomorph Gift and Box
Tablet Mounting Brackets from Scratch
Garden Bin Hinge Pin
Pug, Alpaca, Hodor.
I am Groot.
Print in Place Elephant
Dialing in the Anycubic Kossel
The start of a new hobby
The Deepoon DPVR E3 Virtual Reality Headset
Today I’m reviewing the DPVR E3. This is a Virtual Reality headset with a high resolution display, comfortable straps and an experience that’s similar to the Oculus Rift.
VPN Connection Indication on Windows
The Virtoba S1 Daydream VR Bluetooth Controller
The Virtoba S1 is a Daydream compatible controller from China that costs around £15 ($20). Let me just start with saying I’ve got a lot of cheap Bluetooth controllers –…
Enabling Google Daydream Support on OnePlus 3T
My workflow for discovering new VR content
Since launching the UX of VR website last year I’ve been looking for ways to keep on top of new VR content. For most of the last year I relied…
The GPD Pocket Ultra-mobile PC UMPC Laptop
The GPD Pocket is a 7” Ultra-mobile PC that at first glance resembles a shrunken Apple Laptop, but it’s metal unibody exterior is where the similarities end.
Children of Time book review
The inevitable HTC Vive post
I bought an HTC Vive last November (a week before the Black Friday sales, doh!) and have spent the time since trying to get the most out of it. So…
Useful bash aliases for VPS
Well that has been a crazy couple of months... Onward!
In October 2016 I spent every day of the month creating something for Google Cardboard using JavaScript — Cardboctober. Since then I’ve been preoccupied with a couple of other mostly…
[2016]
31: Something in the Shadows
Today is the last day of Cardboctober! And less surprisingly, it’s also Halloween 🎃 - For today’s hack I’ve made something spooky. If you don’t like spiders, you should look…
30: Github Contributions
For today’s Cardboctober, having shed the burden of creating Tetris in VR, I decided to hack around with data visualisation.
29: Blocks out of the pram
Bit of a lame one for today. I feel like I’ve not been making much progress with the Tetris rewrite, and tackling collision detection with unexpected results is getting quite…
28: Planning Revisited
I thought it’d be weird to drop a hardware post in this week as I’ve not finished the Tevris game yet, so this week’s post will continue the Tetris theme…
27: Moving with gaze
Today’s hack is more an aside while I’m focussing on yet another Tevris rewrite.
26: Rotating Pieces
For today’s Cardboctober we’re still working with Tetris. The task today is to make the pieces rotate.
25: Creating and Moving Pieces
Today we’re going to be looking at creating Tetromino pieces and moving them around the board.
24: Basic Game Board
For today’s hack we’re going to start putting the teVRis game board together. We’ve already looked at positioning objects in a circle around the camera, but that doesn’t solve the…
23: Planning Tetrominoes in VR
I outlined the plan for the week yesterday: To make a tetromino game. So here’s how we’re going to do that.
22: Putting it all together
We’re starting the final (full) week of Cardboctober now, so I thought I’d do a week-long project to pull together some of the ideas from Cardboctober.
21: One size doesn't fit all
An important factor in whether VR works for you or not is how well the hardware fits – both in terms of fitting your head shape and being aligned with…
20: Which way is North? Part 2
In yesterday’s post I talked about the problem of using Cardinal North with device orientation, and how Three.js’ Device Orientation Camera provides a utility function for setting the alphaOffsetAngle, today…
19: Which way is North? Part 1
When developing for Google Cardboard VR with JavaScript we’re depending on the browser’s support of device orientation to know which way the user is looking. You can’t guarantee the user…
18: Moving around in VR
Unless your VR experience is a roller coaster or some other sort of rail-based experience, you shouldn’t take movement control away from the user. Lack of movement control can cause…
17: Displaying Pertinent Information
Some Cardboard experiences might require pertinent information to always be visible to the user. As we’re working with a stereoscopic and not particularly high resolution screen this raises a couple…
16: Getting in and out of Fullscreen
Today we’re looking at the task of getting in and out of Fullscreen. Fullscreen helps maintain an immersive experience. When using JavaScript as we’re confined to the capabilities of the…
15: The Hierarchy of Needs in Quick Google Cardboard Hacks
This week I’m going to be writing about some of the UX challenges encountered while creating Cardboctober hacks. In VR experiences it’s important to consider the needs of the person…
14: Debugging your Cardboard with Chrome
Today I’m going to be talking about how I test and debug while working on this Cardboctober hacks. If you make it to the end I’ll have a recap of…
13: AAAAH! More Zombies
For today’s hack I’m revisiting yesterday’s zombie game again. With a full re-write to un-bodge the implementation.
12: AAAAH! Zombies
Today’s hack was going to be built around the gamepad API – but I utterly failed to get it working nicely with any of my USB or Bluetooth controllers. Not…
11: Webaudio Beat Sequencer
For today’s hack I’ve decided to make a VR beat sequencer. Nothing says inclusive-fun like a VR experience that makes noise! So let’s get on with that.
10: HTML5 Video
Today we’re looking at HTML5 video – well not in the traditional sense. We’re looking at using the <video> element to create a texture and then applying it to an…
09: Speech recognition
Today’s hack is using the speechRecognition API. How can this be useful in Google Cardboard VR? It can add another level of input to our limited arsenal. So let’s take…
08: Playing sounds
Kicking off Cardboctober week 2 (in which I’ll be talking about using various Web APIs) today we’re looking at audio. Or more specifically how to get audio in to your…
07: Cardboard hardware (cardware?)
Today’s hack (and each Friday for the rest of October) is going to be hardware rather than software themed. If you get all the way to the end of the…
06: VR Pairs Game
Todays hack is intended more as an activity to pull together various bits from the first week of Cardboctober and make a game. So here we go, it’s a “pairs”…
05: Loading external models
Using a couple of Three.js plugins you can load external models in to your scene. The plugins are: OBJLoader.js MTLLoader.js OBJLoader lets you load .obj format models, and MTLLoader lets…
04: Skyboxes and generating meshes
Skyboxes There are a couple of ways you can create a skybox in Three.js Using a skydome (a textured sphere) Using a skybox (a textured cube) I’m using the textured…
03: Even better gazed based look interaction
Improving on yesterday’s Raycaster based look interaction, I’ve improved the raycasting experience.
I’m using a library called vreticle.js, though I’ve tweaked it a bit.
02: Raycaster based look interaction
For today’s Cardboctober hack I’m doing some basic look interaction.
As you look at each ghost in the circle surrounding you the ghost will cover their eyes.
01: Basic VR
Kicking off Cardboctober I’ve decided to go with something very simple. This is actually pretty much one of the JSCard demos that I created last November for my 20 Minutes…
Announcing Cardboctober
Throughout October Ben and I are working on a project called Cardboctober. The challenge is hacking on something new every day using Google Cardboard.
The Chuwi Vi10 Plus Windows and Android Tablet
Upgrading to El Capitan with an old installer
Summer of Hacks: Game Dev Day
As part of the JS Oxford-organised Summer of Hacks, I co-organised the “Game Dev Day” hack day in Oxford. This is the second time I’ve held an event during the…
Getting to know @for, @each and @while in Sass
[2015]
20 Minutes into the Future with Google Cardboard and JavaScript
I gave this talk at JS Oxford in November 2015. The talk is about using JavaScript and various web APIs to create Google Cardboard experiences.
Downgrading Nexus 5 from Android 6.0 to Android 5.1.1
UX in Virtual Reality
I’ve been trying to find resources on the subject of User Experience and User Interface design in Virtual Reality a lot lately, as I’m thinking about Google Cardboard, and preparing…
The GPD XD Portable Android Games Console
In which I find a better Imgur screenshot uploading application
On being spammed for being interested
Getting Notified when a process is using 100% CPU on Mac OS X
Jekyll Antipatterns
Creating an icon font
I’ve recently been doing a lot of working designing an icon font that works well at small sizes for my day job. Here’s an overview of the process I’m using…
Extract the first image from a post in Jekyll
Launching Sketch Toolbox from inside Sketch
I’ve been making use of Sketch a lot lately. One of the coolest features of Sketch is it’s plugin support. I’m using a tool called Sketch Toolbox to manage plugins…
My face and words in print
Recently I was contacted to provide a short quote about why CSS preprocessors are awesome. This wasn’t a hard task as I spend a lot of time evangelising the use…
The Revo K101 Plus Portable Games Console
Today I’m refreshed to be reviewing a console that doesn’t try to cram too much in to the form factor, but instead tried to focus on doing one thing well….
Maintaining updates for a bunch of WordPress sites with Google Spreadsheets
Vivaldi: Another contender to the array of Webkit-derived browsers
Creating 'Material Design' shadows in Photoshop
[2014]
So you want to organise a hack day?
These are based on my experience of organising SusHack in 2013 and 2014. For more information about SusHack, check out https://sushack.github.io
Better link underlines with Sass
The Tronsmart Mars G01 Game Pad
The GPD G5A Portable Android Games Console
SusHack #2
This past weekend was the second SusHack. Following on from the success of the first SusHack there was some demand for a second one, so a little later than planned…
jQuery Conference 2014
Why your reasons for no-longer using a CSS pre-processor are wrong, and you're wrong, and you should feel bad.
Some approaches for creating diagonal section separators for your website
Max Glenister Uses This
Making suspend on lid-close work with Arch Linux on the HP Chromebook 11
Using the Zed editor with Arch Linux ARM on your Chromebook
Compressing PDF files from your Mac or Linux terminal with Ghostscript
I arrived at this solution recently when looking to compress a massive print-quality PDF for the web. If you search for “compressing pdf files on mac” you’ll get lots of…
Using "jekyll-redirect-from" with GitHub Pages
Jekyll for dummies
Video: Installing Arch Linux ARM on the HP Chromebook 11
The GPD G7 Portable Android Games Console
Installing Arch Linux ARM on the HP Chromebook 11
Getting started with using Sass in your existing website
Sass is a CSS-compatible preprocessor for CSS. It allows you to reduce the amount of duplication and complexity in your CSS by using variables, mixins (functions), nesting, and other cool…
On the subject of "Pixel-perfect PSD to HTML/CSS"
I read an article on the subject of implementing a PSD design of a website perfectly in HTML/CSS, and without wanting to spend my time writing a lengthy response in…
So, I've got all of these Raspberry Pi accessories... now what?
[2013]
The JXD 7800B Portable Android Games Console
The HP Chromebook 11
SusHack #1: Building the foundations of the Oxford Flood Network Stack
This past weekend I held my first hack day. This is a recollection of why/how SusHack came to be, and how the day went.
Migrating from Outlook .pst to mbox and then uploading to an IMAP mail server
Gamification of life with the Fitbit Flex
Adventures in IMAP: Migrating lots of mail to Atmail
Making Postgres work nicely on OS X Mountain Lion
Adding support for <!-- more --> tag to Jekyll without plugins
Awesome Bash arrays
On second thought...
Converting SVG to PNG online and in your terminal
This post is mostly for my own benefit on the rare occasion that I have to convert SVG files to PNG. I always spend a large amount of time looking…
Chrome 'Add to Trello' extension
Removing the Blackberry Desktop Software for Mac without having to re-download a 70mb installer from Blackberry
Google's relaunched Hangouts -- Wow.
So I've got a Raspberry Pi, now what?
Meta post about making this blog responsive and not using px
jQuery UK 2013 - A tale of beer, colourful cakes and no wifi
Fluid video embeds for your responsive website
These tabs they are a changin'
Factory resetting a Nokia N900 from Mac OS X Mountain Lion
Testing responsive layouts with the RWD bookmarklet
[2012]
The woes of trailing commas in IE
Ubuntu (native) on the Nexus 7
A simple 'stacked paper sheets' effect with CSS3
Installing MySQL on OS X Mountain Lion
The Nexus 7 Android Tablet from Google
Making HTML5 input placeholder text behave in Safari
Getting to grips with git log
Saving your CSS changes in the Google Chrome inspector
Dynamic location based desktop on your Mac with Satellite Eyes
The Mele A2000 Android TV Box
Dealing with crappy memory management in OS X
Using jQuery to create a custom thumbnail for an embedded video
A possible solution to 'bad interpreter: operation not permitted' error on Mac OS X Lion
High fidelity in low fidelity emails
On scrolling
Scrolling on the web is something that we take for granted when thinking about how users will interact with our website. There are two schools of thought on the subject:…
Video integration with Jekyll
Moving away from Twitter Bootstrap - Hello new design!
Upgrading my Macbook Pro
Updates to my 'install all firefox' bash script for Mac OS X
jQuery UK Conference 2012
Adding more post metadata to Jekyll with YAML
On migrating from Tumblr to Jekyll Bootstrap
Synchronising your Sublime Text 2 preferences with Dropbox
[2011]
prev/next to left/right arrow key bind userscript
Bash script to install all major versions of Firefox on OS X
Trying coffeescript
Notched - indicate if Notch has replied to a topic on /r/minecraft comments
Imgur Url Changer and pics/funny comment link subreddit remover aka reddit link stuff
Google Plus userstyle for Reddit
Reddit open imgur links in new window/tab
Reddit imgur to filmot url changer
My solution to the JavaScript challenge 07/03/11
Javascript function to group repeated values of an array with totals
Javascript/jQuery challenge of the week 07/03/11
Building JavaScript arrays from HTML using regular expressions
Review: The Smashing Book #2
Grooveshark view-modes userscript for Fluidapp/Chrome/GreaseMonkey
Redesigning and relaunching Dingoonity
[2010]
Wills & Kate unofficial commemorative mug by Chris Shipton
A simple solution for a jQuery animation loop memory leak
Using Greasemonkey scripts with Google Chrome
Waka Waka - Pacman Moleskine! and some Objective-C
Minecraft and cinnamon coffee
Minecraft player skins
Upgrading Mac OS X Snow Leopard on the Dell Inspiron 1525 to 10.6.4
My first half-week with Kindle
Installing Mac OS X Snow Leopard on the Dell Inspiron 1525
Using jQuery to supply and clear default input values
[2009]
I've been busy
Installing OS X Snow Leopard on the Dell Inspiron 1525
Creating the moanlog search form with CSS
[2007]
[2006]
DS Lite
Site Changes
heart rating icons for foobar
My foobar setup
College
Grey Media Icons
Absent
Harmless Fun
Icecons
Finally working on a new design
New Columns_UI Config
Mog Blue Icons
Foobar2000 Tutorial
CSS Tabs, ala mog
Site updates
Silk utorrent icon
No-hue Icons
Pixel-level Detail
Lego USB Stick
With a lack of better words..
Pointless software
The great return
[2005]
[2004]
wow thats great.
..humbug, christmas break, and assignments
december.
while the crowbar gets rusty..
well, this sucks.
no, no! dont do that!
eugh - i'm bored.
Pizza & icecream.
css, xhtml, and faking "jet lag"
Busy busy
</summer>
The wonders of validation
Out of sync
A few more things
So the site returns
it's here
Well.
bling bling.
...
For your convenience
and it begins
set back?
over the next few weeks…
le sigh
Well then
Voyeurism
Boing.
Jeans jeans jeans jeans
monday.. aaah, monday :)
*pushes new pc to the side*
Two posts in one day...
Well...
So, what?
Good news bad news