Advertisement · 728 × 90

Posts by Aaron Christiansen

I wrote a blog post about how Loconundrum actually works. Thank you to everybody who's played!

aaronc.cc/2026/03/29/l...

3 weeks ago 2 0 1 0

Thanks! The walking routing is currently very naive and optimistic, I’m going to look at ways to fine-tune it in the future.

4 weeks ago 0 0 0 0
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.

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.

Arc's "File" menu is probably the worst example of macOS Tahoe's automatic menu icons that I've seen yet

4 weeks ago 1 0 0 0
Preview
Loconundrum A daily game: can you guess the UK rail station?

I made a daily game where you try to guess a UK rail station!

loconundrum.aaronc.cc

1 month ago 8 7 6 3
#[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]
    "#);

#[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] "#);

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!

2 months ago 1 0 0 0
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.

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.

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

2 months ago 1 0 0 0

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”

2 months ago 0 0 0 0
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.

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.

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...

2 months ago 2 0 0 0
Advertisement

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.

3 months ago 0 0 0 0
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.

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.

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.

3 months ago 0 0 1 0
Preview
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

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...

3 months ago 1 0 1 0
A particle simulation in a Chrome browser window. Large blobby red and orange particles surround a yellow point, similar to a flame.

A particle simulation in a Chrome browser window. Large blobby red and orange particles surround a yellow point, similar to a flame.

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/

3 months ago 0 0 0 0
A screenshot of the "Leap Motion Control Panel" for Windows

A screenshot of the "Leap Motion Control Panel" for Windows

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!

3 months ago 1 0 1 0
A Windows dialog with this text:

This program can only be installed on versions of Windows designed for the following processor architectures: x64

A Windows dialog with this text: This program can only be installed on versions of Windows designed for the following processor architectures: x64

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!

3 months ago 1 0 1 0
A macOS camera selector menu listing "Leap Motion Controller" as an option

A macOS camera selector menu listing "Leap Motion Controller" as an option

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

3 months ago 0 0 1 0
A screenshot of the "Ultraleap Control Panel" showing my hands with some tracking skeletons overlaid.

A screenshot of the "Ultraleap Control Panel" showing my hands with some tracking skeletons overlaid.

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.

3 months ago 1 0 1 0
A Leap-branded Micro USB 3.0 cable

A Leap-branded Micro USB 3.0 cable

The crucial requirements for "startup gadget from 2013" are ticked:

* Dead links in all of the box paperwork
* Micro USB 3.0

3 months ago 0 0 1 0
Advertisement
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."

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."

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!

3 months ago 0 0 1 0
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 }

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 }

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

3 months ago 1 0 0 0

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.

3 months ago 2 0 1 0
Preview
SPACE BLASTER by Aaron Christiansen Minimal space game for Langjam Gamejam

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

4 months ago 2 0 0 0

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.

4 months ago 3 0 1 0
Preview
Ruby argument validation with pattern matching

Ruby argument validation with pattern matching

aaronc.cc/2025/12/12/r...

4 months ago 1 0 0 0

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.

4 months ago 2 0 0 1
Advertisement
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]);
```

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]); ```

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!

4 months ago 3 0 0 1

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…

5 months ago 1 0 0 0

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

5 months ago 2 0 1 0

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

5 months ago 2 0 1 0
Preview
Paged Out! Deeply technical zine. And it's free.

I found out about the “Paged Out!” Magazine, which publishes one-page articles about programming and computing. I absolutely LOVE this

pagedout.institute

5 months ago 4 0 1 0
The 3D-printed macro pad, now with a thick base plate with a cutout for a USB port, and grey keycaps fitted.

The 3D-printed macro pad, now with a thick base plate with a cutout for a USB port, and grey keycaps fitted.

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.

5 months ago 1 0 0 0