Sign in

Aaron Christiansen

@aaronc.cc
98 followers 260 following 83 posts

Software Engineer in Leeds, UK. Web, Ruby, Rust, and electronics. he/him Cross-posting to Mastodon: @aaronc81@ruby.social

PostsRepliesMedia
Aaron Christiansen @aaronc.cc · 16/09/2026
Great example SVGs over on MDN
Screenshot of MDN, showing a documentation example for the SVG "text" tag. It reads "My cat is grumpy!", with "cat" in large bold text, and "Grumpy" in very large red text.
000
Aaron Christiansen @aaronc.cc · 15/09/2026
Working on this modelling tool again - now you can define *recursive* operators, which lets you construct complex layouts of children based on each of their geometries. Here's a `stack` operator which arranges all children next to each other, even of different sizes, with a gap between each.
A code editor showing this code:

```
operator stack(gap = 0) {
    if ($children == 1) {
        children();
    }

    if ($children > 1) {
        child = children(0);

        translate([child.max_point.x + gap, 0])
        stack(gap = gap)
        ...children([ 1 : $children - 1 ]);
    }
}

stack(gap = 0.5) {
    cube(1);
    cube(2);
    cube(3);
}
```

Besides that, a model viewer shows three cubes of increasing size, with a small gap between each.
000
Aaron Christiansen @aaronc.cc · 04/09/2026
Thanks Geoff! Surprisingly there are quite a few places with CRS codes which aren't train stations, so they also appear in this list - including some bus stops, like Preston Park. Occasionally these can appear as part of routes, if a bus is faster than a train for a specific leg.
010
Aaron Christiansen @aaronc.cc · 23/06/2026
It's day #100 of Loconundrum! Thanks so much to everybody who's played - it's been lovely to hear from people enjoying the game. To mark the milestone, you can now play all 100 past puzzles from the new Archive! Fill out a missed day, or catch up on puzzles from before you started playing.
Screenshot of the new Archive page, showing a colour-coded calendar of different puzzle days
241
Aaron Christiansen @aaronc.cc · 14/06/2026
To find candidate stations I use this National Rail map (railmap.nationalrail.co.uk) and this dataset of station foot traffic (dataportal.orr.gov.uk/statistics/u...). "Quick check" tells me if I've used a station before, and links to Realtime Trains so I can check that services are frequent enough.
railmap.nationalrail.co.uk
Rail Map
000
Aaron Christiansen @aaronc.cc · 14/06/2026
Here's a peek behind the curtain at Conductor, the thrown-together dashboard I use to schedule Loconundrum puzzles. It used to automatically pick at random from a pool, but once I ran out of the major stations, I started scheduling puzzles manually instead so I could test things out a bit more.
Conductor UI. There are filters "Show all previous days, reveal today/tomorrow/future days" and a tools section with "All CRSes to date", "Quick check", and a "re-run routing" button. Underneath is a list of all stations queued up, with buttons to reorder or edit them.
130
Aaron Christiansen @aaronc.cc · 09/06/2026
Loconundrum now has dark mode 🌙
A screenshot of Loconundrum with dark mode activated
020
Aaron Christiansen @aaronc.cc · 01/06/2026
Awesome, let me know if this works for the spreadsheet: api.loconundrum.aaronc.cc/history?incl... (Or, to omit today's puzzle to avoid spoilers: api.loconundrum.aaronc.cc/history) Should update live as soon as midnight rolls over :)
api.loconundrum.aaronc.cc
https://api.loconundrum.aaronc.cc/history
LTN MBR CAR SLO BSK GLQ NRW NMP MIA SHF PRE NCL EXD SVG MCV CTR BDI CBG IPS PBO BTH PLY DON LBO BHI BTN SSD SWA LIV LDS COV RDG GTW MKC DAR YRK ABD SOT NOT EDB DBY DEE DHM LEI HUL CRE OXF LAN WVH LMS ...
110
Aaron Christiansen @aaronc.cc · 01/06/2026
Are they looking for data which will continuously update every day, so the spreadsheet can be kept up-to-date by pulling the data daily? If so, I can try setting that up in the coming days! But if you only need the days between #75 and today as a one-off, let me know and I can provide those too :)
100
Aaron Christiansen @aaronc.cc · 29/05/2026
Hi! Glad you’re all enjoying Loconundrum. I’m away from my laptop at the moment so the best I can give is a list of the CRS codes (without station names) from puzzle #1 to today’s #75 - hope that works for you! pastebin.com/dUyX8D1W
pastebin.com
LTNMBRCARSLOBSKGLQNRWNMPMIASHFPRENCLEXDSVGMCVCTR - Pastebin.com
Pastebin.com is the number one paste tool since 2002. Pastebin is a website where you can store text online for a set period of time.
200
Aaron Christiansen @aaronc.cc · 27/05/2026
It thinks the route with many changes is faster enough to be worth taking - but I disagree! I'm fine-tuning the routing on the new experimental branch, which now gets this right and picks the direct service. Feel free to join and share any more feedback: loconundrum.aaronc.cc?experimental
loconundrum.aaronc.cc
Loconundrum
A daily game: can you guess the UK rail station?
110
Aaron Christiansen @aaronc.cc · 27/05/2026
Oh no! Are you happy to let me know your starting station so I can take a look please? (Followed so you can DM if you’d prefer)
100
Aaron Christiansen @aaronc.cc · 10/05/2026
Thanks! There's a hand-curated pool of stations which it can pick from. This started off with mostly major stations, but I'm starting to run out of those, so I'm throwing in some slightly less-visited ones too.
010
Aaron Christiansen @aaronc.cc · 10/05/2026
Thanks for the report! If you're happy to reply or DM me your starting station, I'll add this to my list of routing quirks to investigate.
100
Aaron Christiansen @aaronc.cc · 28/04/2026
Thanks! Yeah, it’s a hand-curated list of stations that I’m reasonably sure most people will have heard of. I manually filtered the top ~200 entries of the station footfall rankings. Over time I might start introducing some slightly trickier ones, but I think Millom is probably a while off 😉
020
Aaron Christiansen @aaronc.cc · 28/04/2026
Agreed, that seems like an unnecessarily complicated route - I’ll see what I can tweak to handle that better. Thanks for the report!
110
Aaron Christiansen @aaronc.cc · 24/04/2026
Thanks @rangerrenze.bsky.social for the spot and letting me know :)
000
Aaron Christiansen @aaronc.cc · 24/04/2026
Right now it's a manually-curated list of mainline stations. The difficulty's been about right for a while, but people are definitely getting better! I might start mixing in some less mainline stations in the future. I've also seen suggestions for a "hard mode" which sounds interesting 👀
100
Aaron Christiansen @aaronc.cc · 24/04/2026
Ah, damn 😣 Thanks for letting me know. Birmingham New Street is the wrong one - I've hotfixed the site and it should be sorted now. bsky.app/profile/aaro...
000
Aaron Christiansen @aaronc.cc · 24/04/2026
If you played Loconundrum today (puzzle #40, 2026-04-24) before 7am BST, there's a chance you may have got the wrong puzzle due to a caching issue. If you got Birmingham New Street, you were affected. It should be fixed now, please load up Loconundrum again and have another go! Sorry about that 🚂
210
Aaron Christiansen @aaronc.cc · 30/03/2026
I wrote a blog post about how Loconundrum actually works. Thank you to everybody who's played! aaronc.cc/2026/03/29/l...
aaronc.cc
Building Loconundrum, a rail station daily guessing game
I wanted to brush up on some web skills, so I made Loconundrum. Along the way, I was significantly side-tracked by calculating journey times using rail open data.
250
Aaron Christiansen @aaronc.cc · 23/03/2026
Thanks! The walking routing is currently very naive and optimistic, I’m going to look at ways to fine-tune it in the future.
000
Aaron Christiansen @aaronc.cc · 20/03/2026
Arc's "File" menu is probably the worst example of macOS Tahoe's automatic menu icons that I've seen yet
Screenshot of the macOS menu bar for Arc, with the "File" menu expanded. There are about 20 options, but only one of them has an icon, "Save Page As", which causes a bizarre-looking intendation for the icons around it.
010
Aaron Christiansen @aaronc.cc · 18/03/2026
I made a daily game where you try to guess a UK rail station! loconundrum.aaronc.cc
loconundrum.aaronc.cc
Loconundrum
A daily game: can you guess the UK rail station?
6128
Aaron Christiansen @aaronc.cc · 19/02/2026
Falling in love with inline snapshot testing My usual problem with snapshot testing is that you need to find the snapshot files to learn the expected output of a test - but with inline snapshots, the expectation is in the test code, which can be updated automatically by the snapshot tool. Neat!
#[test]
fn test_no_subcommand() {
    let test_env = TestEnvironment::default();
    test_env.run_jj_in(".", ["git", "init", "repo"]).success();
    let work_dir = test_env.work_dir("repo");

    // Outside of a repo.
    let output = test_env.run_jj_in(".", [""; 0]);
    insta::assert_snapshot!(output, @r#"
    ------- stderr -------
    Hint: Use `jj -h` for a list of available commands.
    Run `jj config set --user ui.default-command log` to disable this message.
    Error: There is no jj repo in "."
    [EOF]
    [exit status: 1]
    "#);
020
Aaron Christiansen @aaronc.cc · 09/02/2026
For the latest Gosu Game Jam, I wrote a crop-cultivating roguelike deckbuilder in Ruby, where you race the clock to score coins by combining your crops' effects. This is the most fun I've had creating a jam entry, I've wanted to try making a card game for a while! orangeflash81.itch.io/topsoil
Screenshot of the game. There's 01:24 left on the timer. From my hand, I'm playing a Runner Bean, which reads "On Harvest: Enhance this tile's growth rate by 20%." I'm hovering the game grid, which has crops at various stages of growth already, to decide where to plant my Runner Bean.
010
Aaron Christiansen @aaronc.cc · 31/01/2026
Every single OS update I think to myself that they must’ve fixed this by now, then check Balance Lock and it says “fixed 10 minutes ago”
000
Aaron Christiansen @aaronc.cc · 26/01/2026
TIL that: 1) you can have SVG favicons nowadays, and 2) they can be styled to respond to light/dark mode automatically evilmartians.com/chronicles/h...
Your HTML page should have a <link> tag in its <head> with rel="icon", type="image/svg+xml" and with the href containing a link to the SVG file as attributes.

SVG is an XML format and can contain a <style> tag to describes CSS. As with any CSS, it can contain media queries like @media (prefers-color-scheme: dark). This will allow you to toggle the same icon between light and dark system themes.
010
Aaron Christiansen @aaronc.cc · 05/01/2026
SF Symbols has some kind of alias system - if you search "refresh" you will find "arrow.clockwise" - but it doesn't show all of the known meanings of an icon in any obvious way. If you're scrolling through SF Symbols looking for an icon which looks about right, those aliases aren't obvious.
000
Aaron Christiansen @aaronc.cc · 05/01/2026
The inconsistency of icon usage between apps is really interesting, and I wonder if it's consequence of how SF Symbols (Apple's icon font) is organised. Icons are named by SHAPE, not PURPOSE. That could make it more likely for different apps to assign different meanings to the same icon.
A side-by-side comparison of SF Symbols and Material Symbols. The SF Symbol icons are named "arrow.clockwise" whereas the material icon is named "Refresh". This is repeated for fullscreen and reply icons.
100
Aaron Christiansen @aaronc.cc · 05/01/2026
Agree with a lot of the points in this article. I've found Tahoe's menus take me noticeably longer to scan than before, and I think it's partly down to the inconsistent visual noise of the icons. tonsky.me/blog/tahoe-i...
tonsky.me
It’s hard to justify Tahoe icons
Looking at the first principles of icon design—and how Apple failed to apply all of them in macOS Tahoe
110
Aaron Christiansen @aaronc.cc · 04/01/2026
Even better, this ancient version still supports WebSocket integration, so there are some fun browser toys you can play around with. I enjoyed flailing my hand to interact with this particle simulation (which also works with a mouse): molefrog.com/etc/knife/
A particle simulation in a Chrome browser window. Large blobby red and orange particles surround a yellow point, similar to a flame.
000
Aaron Christiansen @aaronc.cc · 04/01/2026
Windows is more promising, because there are older (so more compatible) driver versions available, still branded as "Leap Motion". After downgrading from v6 to v2 drivers, with a manual patch for Windows 10+ (web.archive.org/web/20250309...), this device works with some of the stuff on itch.io!
A screenshot of the "Leap Motion Control Panel" for Windows
110
Aaron Christiansen @aaronc.cc · 04/01/2026
I suspect the development scene was more active when this gadget first released 😅 In an itch.io search for "Leap Motion", every macOS game is either too old to run, or can't see my hands. The Windows driver doesn't support ARM, so no Parallels. I'll have another go later on an x86 Windows PC!
A Windows dialog with this text:

This program can only be installed on versions of Windows designed for the following processor architectures: x64
110
Aaron Christiansen @aaronc.cc · 04/01/2026
The infrared camera actually shows up to macOS as a camera, but sadly selecting it doesn't seem to work - the video freezes on the old camera. I won't be giving my colleagues Ghost Hunters-style Zoom calls any time soon
A macOS camera selector menu listing "Leap Motion Controller" as an option
100
Aaron Christiansen @aaronc.cc · 04/01/2026
The software is now distributed as "Ultraleap" - somewhat amazingly, It Just Works on my Apple Silicon Mac. The hand tracking seems pretty good! It feels more responsive than my Quest 2 or 3 in this demo window.
A screenshot of the "Ultraleap Control Panel" showing my hands with some tracking skeletons overlaid.
110
Aaron Christiansen @aaronc.cc · 04/01/2026
The crucial requirements for "startup gadget from 2013" are ticked: * Dead links in all of the box paperwork * Micro USB 3.0
A Leap-branded Micro USB 3.0 cable
100
Aaron Christiansen @aaronc.cc · 04/01/2026
Do you remember this gadget? It was sold as letting you control your apps/games with your hands. Young-me saw this in Maplin back in the day, thinking how cool it would be. I saw one in a second-hand shop, for a price where I'm not too bothered if it's rubbish. Let's satisfy young-me's curiosity!
The box for a "Leap Motion" controller. It shows the device on the front - a light-grey metal cuboid with a piano-black top. The copy on the front of the box reads "The remarkably accurate, incredibly natural way to interact with your computer."
100
Aaron Christiansen @aaronc.cc · 02/01/2026
I've done some mad science with Ruby 4.0's new Ruby::Box namespacing feature - what if Ruby had JavaScript-style `import`/`export`, rather than requiring entire files? You only get what you import, and imported items don't "leak" between files. Try it, if you dare: github.com/AaronC81/rixby
A VS Code window with three editors:

shapes.rb:
class Rectangle export
end

class Circle export
end

assertion.rb:
export def assert_equal(expected, actual)
end

canvas_test.rb:
import { from 'canvas', :Canvas }
import { from 'shapes', :Rectangle, :Circle }
import { from 'assertion', :assert_equal }
010
Aaron Christiansen @aaronc.cc · 01/01/2026
Thanks! I’ll keep adding primitives, and polish the editor, until I’m happy using it for 3D prints (mostly organisers or electronic project boxes) Aiming to be as parametric as OpenSCAD, where you write code to calculate measurements based on other ones. More procedural/functional than declarative.
120
Aaron Christiansen @aaronc.cc · 19/12/2025
Had a good time with Langjam Gamejam - a week-long jam where you build a language and then use it to write a game. The resulting game is pretty simple - I didn't have much time left after getting the language to a usable state - but I think it's at least fun! orangeflash81.itch.io/space-blaster
orangeflash81.itch.io
SPACE BLASTER by Aaron Christiansen
Minimal space game for Langjam Gamejam
020
Aaron Christiansen @aaronc.cc · 13/12/2025
For a bit of polish and ease-of-experimentation, there's now a basic editor! Here's one possible implementation of a rounded rectangle. Being able to define a new operation that inspects the geometry, like this `rotate_around_centre`, feels rather useful to me.
YASCAD code editor, with dark theme. On the left, a Monaco code editor, with file and rendering controls. On the right, an orange cuboid with rounded corners on a grid.

The code in the editor is:

operator rotate_around_centre(angle) {
    c = buffer() children();

    // Move so that centre is on (0,0), rotate, then move back
    dx = c.origin.x + c.size.x / 2;
    dy = c.origin.y + c.size.y / 2;
    translate([dx, dy])
    rotate(angle)
    translate([-dx, -dy])
    copy(c);
}

// Subtract this from a rect to round its closest corner to the origin
module rounded_corner(r) {
    translate([r, r]) rotate(180)
    difference() {
        square(r);
        circle(r=r);
    }
}

module rounded_rect(w, h, r) {
    difference() {
        square([w, h]);

                                                        rounded_corner(r);
        rotate_around_centre(90)  translate([w-r, 0])   rounded_corner(r);
        rotate_around_centre(180) translate([w-r, h-r]) rounded_corner(r);
        rotate_around_centre(270) translate([0, h-r])   rounded_corner(r);
    }
}

linear_extrude(1)
rounded_rect(5, 6, r=1);
130
Aaron Christiansen @aaronc.cc · 12/12/2025
Ruby argument validation with pattern matching aaronc.cc/2025/12/12/r...
aaronc.cc
Ruby argument validation with pattern matching
010
Aaron Christiansen @aaronc.cc · 30/11/2025
Starting to get interesting - now you can write operator modules which behave based on some properties of their children - here repeating the children in a grid. You can't do something like this in OpenSCAD unless you also pass a separately-calculated size for the children.
Code editor showing cylinders repeated on a 3x4 grid.

Code:

```
// Repeat the children a certain number of times in the
// X and Y directions to form a grid
operator repeat(xs, ys) {
    // Draw the children to a virtual buffer once
    t = buffer() children();

    for (x = [0:xs-1]) {
        for (y = [0:ys-1]) {
            // Based on the size of that virtual buffer,
            // stamp out copies of the children
            translate([t.size.x * x, t.size.y * y]) {
                copy(t);
            }
        }
    }
}

repeat(3, 4)
cylinder(5, 5);
```
020
Aaron Christiansen @aaronc.cc · 28/11/2025
Having a crack at a project I've been thinking about for a while. An OpenSCAD-alike where you can introspect objects you've already drawn - which means less thinking about how to structure your variables for quick thrown-together 3D prints. First prototype works well!
A code editor showing an STL preview with a small cube on top of another big cube. The code beside is:

```
// Create an object and make a binding for it
big_cube = cube([20, 20, 20]);

// Reference that binding to create another object
translate([0, 0, big_cube.size.y])
cube([5, 5, 5]);
```
030
Aaron Christiansen @aaronc.cc · 12/11/2025
Inline RBS feels like something Ruby 3 needed from the beginning, and now that it’s here it looks really exciting! Need to find some time to play with it and see how it actually feels to use…
010
Aaron Christiansen @aaronc.cc · 09/11/2025
I read a lot of physical magazines when I was younger - Linux User & Developer, NET, The MagPi - and enjoyed the layouts too. You can get a bit creative with your page in a way that’s harder with an online blog that needs to support different device sizes
120
Aaron Christiansen @aaronc.cc · 09/11/2025
Online blogs are great, with a lot of quality content nowadays, but I struggle to actually find new stuff. Aggregators like HN/Lobsters/Reddit only show you a title. Feed-based socials are too noisy Magazines make you flick past everything, and you might catch a glimpse of something interesting
120
Aaron Christiansen @aaronc.cc · 09/11/2025
I found out about the “Paged Out!” Magazine, which publishes one-page articles about programming and computing. I absolutely LOVE this pagedout.institute
pagedout.institute
Paged Out!
Deeply technical zine. And it's free.
140
Aaron Christiansen @aaronc.cc · 02/11/2025
With the 3D-printed base added, and some spare "retro" keycaps, it's good enough for me to call it done! On the software side, it only needed some little tweaks to support the extra three keys, and swap to active-low because it made the wiring easier.
The 3D-printed macro pad, now with a thick base plate with a cutout for a USB port, and grey keycaps fitted.
010