Yeah, it happened. Here’s the things I’m changing as I find them.
Safari Tabs
Go into settings -> apps -> Safari, set it to “bottom” so that you can get back to the tab view with one click rather than having to go into a menu etc.
[Read More]Yeah, it happened. Here’s the things I’m changing as I find them.
Go into settings -> apps -> Safari, set it to “bottom” so that you can get back to the tab view with one click rather than having to go into a menu etc.
[Read More]I was trawling through the logs in my Home Assistant instance recently and this was coming up a lot:
2026-01-21 23:52:38.204 WARNING (MainThread) [supervisor.addons.options] Option 'require_ssl' does not exist in the schema for Node-RED (a0d7b954_nodered)
Took me a little bit to find it, but going to Settings -> Addons -> Node Red -> Configuration tab.. then clicking the … and opening the YAML config, I found an extra line in the config and removed it, fixing the issue. It would have been something from an old version that wasn’t removed automagically.
[Read More]Include this block in your ~/.ssh/config file:
Host *.github.com github.com
Hostname github.com
User git
IdentityFile ~/.ssh/pub/%n.pub
IdentitiesOnly yes
Then you can have a key ~/.ssh/example.github.com and clone from [email protected]/owner/repo and it still connects to github.com but with that specific key. Super handy if you end up with a bunch of different corporate accounts and have deployment keys and nonsense.
The %n makes it use the hostname you provided, so it looks for the relevant key.
Here’s an example of an Enum which is completely legal in Rust and … makes utoipa / axum stack overflow while generating a schema:
#[derive(ToSchema)]
pub enum Filter {
Eq(String, String),
Cnt(String, String),
Pres(String),
Or(Vec<Filter>),
And(Vec<Filter>),
AndNot(Box<Filter>),
}
The problem is that whole “contains itself” thingin the second half of the variants. Again, completely legal, nothing weird about it, but codegen just falls in a heap.
Here’s the fixed version with appropriate attributes:
[Read More]Well that’s a learning; in Dockerfiles you can have steps that look like:
RUN --mount=type=cache,id=cargo,target=/cargo do whatever
RUN --mount=type=cache for example from the docs…
And it’ll only mount the cache folder for that step.. turns out if you do that on a mac, the underlying filesystem of the cache thing is a mac filesystem, so shit gets BROKEN AND WEIRD when the container’s Linux and the programs expect Linux filesystem things.
[Read More]Sometimes networking is cool, sometimes it’s just weird. Linux loves to use IPv4-mapped IPv6 addresses when passing information to servers, so here’s a quick cheat sheet on working them out…
[Read More]From this post on the minecraftforge forums, user “LastAi” mentioned adding the following to your startup parameters:
-Djava.net.preferIPv4Stack=true
This worked for me in CurseForge (settings -> minecraft -> “Default Additional Arguments”)

It took me a little bit to find, but if you can’t get your IKEA Zigbee things to work, press the “link” button four (4) times to “factory reset” them and put them in pairing mode.

The ECOWITT WS90 “Wireless 7-in-1 Electronic Sensor Array Haptic Rain Gauge and Ultrasonic Anemometer” has a place for a 25mm tube to sit on.
I couldn’t find an antenna mount with a 25mm tube, but the “20mm” galvanised pipe assortment fit just fine.
For this you need:
I ended up using the 15mm flange because there wasn’t any 20mm on the shelf, and I needed a fitting to go between the Tee and the plate anyway.
[Read More]Tips on using Obsidian
This goes for how I blog as well, but If I had to search for something on the internet to find information, I’ll generally brain-dump the search terms as well as the answer because that’s how I’m going to find it later.
I use … a variation on Zettelkasten. It is an organisation system where “one idea is an object”. Don’t make megaposts unless they’re indexes, IMO. Break them up, they’re free.
[Read More]