👨‍💻 Wesley Moore

Posts

Looking for posts made before 2020? Check out the previous version of my website.

Building a Tiny CDN With pyinfra and Chimera Linux

In my quest to make linkedlist.org—my link blog—faster, I set up multiple deployments around the world. I used pyinfra to automate the process and Chimera Linux as the host operating system. Join me on this adventure in over-engineering to see how I dropped the average response time across nine global locations from 807ms to 189ms without spending a fortune.

Network diagram of Linked List infrastructure A network diagram showing a user at the top. An arrow from the user points downward to a node labelled Gcore GeoDNS. Three dashed arrows point down from the Gcore node to three servers labelled: AU, FR, and NY. Below the servers at the bottom of the diagram is another smaller server titled Qotom. It has arrows pointing up to each of the other servers with a label over the arrows, "Certs".

A digram of what we’re building.[1]

Continue Reading →

Ubuntu Linux on Snapdragon X Laptop (Lenovo Yoga Slim 7x)

Screenshot of fastfetch output in a terminal window. The details indicate that it's running Ubuntu oracular 24.10 on aarch64.
Ubuntu running on Yoga Slim 7x

Over the course of the last few months some fine folks in the Linux community have been plugging away implementing support for Qualcomm Snapdragon X based ARM laptops. Recently Canonical published Ubuntu 24.10 Concept for testing on these laptops, which I installed and tested on my Lenovo Yoga Slim 7x.

Continue Reading →

Generating a Static Website From a Pleroma Archive

Almost two years ago, in Jan 2023 I migrated from my Fediverse presence from my self-hosted Pleroma instance to a single user Mastodon instance hosted by masto.host. Since then I’ve wanted to retire the Pleroma instance, but I didn’t want to just take it offline. I wanted to preserve my posts and links to them. That became a priority over the weekend so I built a tool, pleroma-archive to do it.

Continue Reading →

Building and Launching My New Link Blog, linkedlist.org (Twice)

I’ve started a new tech focused link blog over at linkedlist.org. “Not another tech blog”, I hear you groan, and rightly so. However my intention is not to cover topics that are already well reported upon like Apple, Google, Microsoft, the latest drama at OpenAI, and other stuff like that. Instead, I plan to focus more open-source, programming, hardware, software, Linux, Rust, retro computing etc. There’s some more details in the welcome post.

In this post I’m going to cover the process I took to the build the site (twice) and some of the considerations that went into it—for a site with only a handful of pages there was a surprising amount of them.

Continue Reading →

Generate a JSON Feed for a Zola Website

JSON Feed is a specification for representing an RSS-style feed in JSON. I wanted to add one as an alternative alongside the Atom feed on a new website I’m building. The website is built with Zola, which unfortunately doesn’t support the format, so this is how I went about adding one.

Continue Reading →

Australian Chimera Linux Mirror

I have set up a mirror of repo.chimeralinux.org on a server in Australia (Brisbane). It’s been running well for a couple of weeks now. The root of the mirror shows an index of what is hosted and when it was last synced. /chimera is where the Chimera data lives.

It mirrors the packages as well as ISO and rootfs downloads. Using the mirror greatly speeds up package downloads, which in-turn makes things like apk upgrade a lot faster. Some rudimentary testing suggests this this server may also provide a speed improvement for folks in parts of Asia too.

Continue Reading →

Announcing Feedlynx

Feedlynx logo: a caricature of a Lynx with a stem in its mouth. At the end of the stem is the orange RSS logo.

My latest project, Feedlynx, is a self-hosted tool that allows you to collect links in an RSS feed[1]. You subscribe to the feed in your RSS reader of choice and read or watch later at your leisure. Plus it has an adorable mascot!

Feedlynx runs on most mainstream operating systems including Linux, macOS, BSD, and Windows and has no runtime dependencies. Check out the latest release to download pre-compiled binaries for some common platforms.

After a few weeks using Feedlynx myself I think it’s ready for others to check out. Read on for more information about my motivations behind building Feedlynx.

Continue Reading →

A Developer's Review of a Snapdragon X Laptop (Lenovo Yoga Slim 7x)

Photo of the Yoga 7x laptop open on a desk showing the Glass House Mountains on the desktop. To the right of the laptop is a coffee mug and a pair of glasses.
Lenovo Yoga Slim 7x Snapdragon

For the last two weeks I’ve been testing out my new laptop, a Lenovo Yoga Slim 7x (14", Gen 9) Snapdragon. This laptop is interesting because it’s one of the initial batch based on Qualcomm’s Snapdragon X Elite Arm CPUs. In this post I aim to provide a detailed review of the device and the experience of using it from the perspective of a software developer. This post was written on the Yoga 7x.

Continue Reading →

Why Chimera Linux

I received a reply to my Tech Stack 2024 post asking: Why Chimera Linux? I wrote a response that turned out longer than anticipated and figured I may as well post it here too. I’m not trying to convince you to use Chimera with this post, just note down why it appeals to me. That’s really the crux of it: there’s dozens of distros out there all with different goals and values and Chimera really speaks to me, for you it might be something else.

Continue Reading →

How Much Is a Browser Worth?

Apparently people are excited about funding independent browser efforts this week. I have little interest in funding yet another browser built in C++ in 2024 but Servo is still alive. Since Mozilla refuse to let us directly fund Firefox I shall set up a recurring donation to Servo.

The next question is how much is a web browser worth to me? Based on minutes spent using a browser, quite a lot!

Continue Reading →

Tech Stack 2024

Inspired by Alex Chan’s Tools of the trade post I thought I’d note down my current tech stack and then revisit it in a few years to see how things evolve. As per Alex’s post I’ll break it down into three sections: software, (development) tech stack, and hardware.

A photo of my desk. There's two displays, the one on the right is rotated into a portait orientation, the left on is on a wooden monitor stand. In front of the monitors are: a PS4 controller, TI-89, tenkeyless mechanical keyboard, mouse, and Kobo e-Reader.
My desk. The computer is behind the displays.
Continue Reading →

Exporting YouTube Subscriptions to OPML and Watching via RSS

This post describes how I exported my 500+ YouTube subscriptions to an OPML file so that I could import them into my RSS reader. I go into fine detail about the scripts and tools I used. If you just want to see the end result the code is in this repository, which describes the steps needed to run it.

I was previously a YouTube Premium subscriber but I cancelled it when they jacked up the already high prices. Since then I’ve been watching videos in NewPipe on my Android tablet or via an Invidious instance on real computers.

Continue Reading →

7bit Projects: Dew Point Forecast, MacBinary, RSS Please, Titlecase

Today I compiled my titlecase Rust crate to Web Assembly and wrapped a web-page around it so that it can be used online. It’s published on my “projects domain”, 7bit.org. After I published it I realised I hadn’t written about the other projects that are on 7bit.org. They are Dew Point Forecast, MacBinary, RSS Please, and Titlecase.

Continue Reading →

Testing a $4 Micro SD Card From AliExpress

I needed three low capacity micro SD cards for an upcoming project. There’s plenty of these available on AliExpress but its very difficult to know if you if the actual capacity will match the packaging. I did some research and came across this interesting video that tested 16 different cards. Their recommendation was the Lexar ones. So I found some 32Gb ones for AU$4.13 and placed an order[1].

Photo of the micro SD card in its packaging.
The card being tested.

As per the video’s suggestion I tested one with an open-source tool called F3 (Fight Flash Fraud) when they arrived. F3 verifies the capacity against what the drive advertises and verifies that that amount of data can be written and read back without error.

Continue Reading →

Building a Hybrid Native Application With Gleam and Tauri

I took a few hours this weekend to experiment with building a hybrid native app with Gleam and Tauri. This post is a summary of that project. If you’d just like to see the code, I have published that at:

https://forge.wezm.net/wezm/gleam-tauri-experiment

Screenshot of the application showing a name field, minus button, plus button, Greet button and the current time.
Screenshot of the application.
Continue Reading →

systemd-sysusers and Chimera Linux

I use Chimera Linux as the primary OS on my laptop (as opposed to my desktop, which is still running Arch Linux for now). Chimera was created in 2021 and reached alpha status in June 2023. Chimera was built from scratch and as the name suggests it comprised of a motley crew of components:

The project and its development is proving very useful to me for seeing how a Linux distribution is built and evolved over time. Watching it progress (and helping a little by maintaining some packages) has helped expose some lesser known (to me) components that make up a typical Linux system, and their role.

Recently systemd-sysusers was introduced. Some folks might find this surprising as Chimera does not use systemd for the role of pid 1/init. As mentioned above it uses Dinit for this. Some standalone parts of systemd are used though. Currently:

  • udev
  • systemd-tmpfiles
  • and now, systemd-sysusers

I had not encountered systemd-sysusers previously (even though it’s probably used on the systemd based distros I’ve used before), so I thought I’d jot down what I learned about it and how it’s used (at the time of writing) in Chimera.

Continue Reading →

Fixing OpenBSD panic dc_atapi_start: not ready in KVM

I tried creating an OpenBSD 7.3 virtual machine on my new computer (Arch Linux host) and the installer kept crashing with the error:

Screenshot of the installer crash.
Screenshot of the installer crash.
dc_atapi_start: not ready, st = 50
fatal protection fault in supervisor mode trap type 4 code 0 rip ffffffff810089d9 cs 8 rflags 10282 cr2 287eb3000 cpl 6 rsp ffff800014fd11a0
gssbase Oxffffffff818fbff0 kgsbase Ox0
panic: trap type 4, code=0, pc=ffffffff810089d9
syncing disks...12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 _
Continue Reading →

Australian and New Zealand Makers on YouTube

I decided I wanted to add some more local folks into my YouTube subscriptions. I put the call out on Mastodon for suggestions for folks doing videos about machining, woodworking, electronics, software, that type of thing. I received a number of helpful replies and thought it might be useful to collect the list (as well as ones I’m already subscribed to) on this page in case others are looking for new channels to check out.

Continue Reading →

Building a Classic Mac OS App in Rust

Instead of using my funemployment to build useful things I have continued to build things for old versions of Mac OS. Through some luck and a little persistence I have actually managed to get Rust code running on classic Mac OS (I’ve tried Mac OS 7.5 and 8.1). In this post I’ll cover how I got here and show a little network connected demo application I built—just in time for the end of #MARCHintosh.

Continue Reading →

How to use DeRez

After my post on trying to run Rust on Classic Mac OS post I continued trying to find a modern language that I can use to build classic Mac OS software. I’ve had some success with Nim and built a little temperature converter application. As part of this I wanted to be able to use ResEdit to edit the layout of the dialog. The problem was that I need a way to convert the modified resources back into the textual representation used in the source code. In this post I describe how I did this with DeRez.

Continue Reading →

Creating a Podcast From a Mastodon Account With XSLT

I recently discovered the ATPrewind account on Mastodon. It’s an account sharing “gems discovered while re-listening to @atpfm from the very first episode. By @joshua”. ATP is a tech Podcast that’s been running for about 10 years. Each post (so far) from ATPrewind includes a short clip from the show in the form of a little video.

This post describes how I was nerd sniped into creating a podcast from the ATPrewind posts.

Continue Reading →

Trying to Run Rust on Classic Mac OS

I recently acquired a Power Macintosh 9500/150 and after cleaning it up and building a BlueSCSI to replace the failed hard drive it’s now in a semi-operational state. This weekend I thought I’d see if I could build a Mac app for it that called some Rust code. This post details my trials and tribulations.

Continue Reading →

Debugging a Docker Core Dump

On my main machine I use an excellent cross-platform tool called Docuum that automatically cleans up unused docker images. This allows me to use Docker without the need to periodically wonder why I’m out of disk space, run docker system prune and recover half my disk.

I installed Docuum via the AUR package (although tweaked to build the latest Docuum release) and ran it via the bundled systemd service definition. This worked great for a while but some time back it started failing. Every time Docuum would try to check for things to clean up I’d see the following in the system journal:

Continue Reading →

Hide Sign in With Google Pop Up

Inspired by Rach Smith’s post on using userstyles to hide YouTube shorts I came up with some CSS to hide those annoying Sign in with Google pop-ups.

Continue Reading →

divmod, Rust, x86, and Optimisation

While reviewing some Rust code that did something like this:

let a = n / d;
let b = n % d;

I lamented the lack of a divmod method in Rust (that would return both the quotient and remainder). My colleague Brendan pointed out that he actually added it back in 2013 but it was moved out of the standard library before the 1.0 release.

Continue Reading →

Garage Door Monitor Update

The garage door monitor that I built earlier in the year has by all accounts been running perfectly since I installed it. Recently I implemented a couple of new features that I’ve wished for over the last few months.

Continue Reading →

Resuming Read Rust Tweeting

The Read Rust Twitter account crossed over 10K followers in the last few days. Amazingly 4350 of those coming after I stopped regular posting. This got me thinking about the account and how I might be able to use it to benefit the community while avoiding the overhead that led me to winding things down in Sep 2020.

Continue Reading →

Generating RSS Feeds From Web Pages With RSS Please

Sometimes I come across a web page that I’d like to revisit when there’s new content. Typically, I do this by subscribing to the RSS feed in Feedbin. Unfortunately some sites don’t provide an RSS feed, which is why I built RSS Please (rsspls). RSS Please allows you to generate an RSS feed by extracting specific parts of a web page. In this post I give a bit of background on the tool and how I’m running it in my Docker infrastructure.

Continue Reading →

Monitoring My Garage Door With a Raspberry Pi, Rust, and a 13Mb Linux System

I’ve accidentally left our garage door open a few times. To combat this I built a monitor that sends an alert via Mattermost when the door has been left open for more than 5 minutes. This turned out to be a super fun project. I used parts on hand as much as possible, implemented the monitoring application in Rust, and then built a stripped down Linux image to run it.

Continue Reading →

Fixing Monospace Text in Kobo eReaders

After verifying with friends that eBook readers do a decent job of rendering technical content I purchased a Kobo Libra 2 this week. I loaded up some books and started reading… but something was off. Sure enough, after verifying the EPUB with Calibre on my computer I confirmed that the Kobo was not rendering text with CSS rules like font-family: monospace in a monospace font.

Continue Reading →

Alpine Linux and Docker Infrastructure Three Years Later

Three years ago I published, Rebuilding My Personal Infrastructure With Alpine Linux and Docker, in which I described how I was hosting various applications using an Alpine Linux host and Docker on a virtual machine at Vultr. I thought it would be good to write a follow-up on how this worked out.

Continue Reading →

ASCII-centric Usernames

I’m working on a web-based side project in my spare time. The great thing about side projects is you get to make all the choices and question the common wisdom. Recently I’ve been building out the sign-up flow and I started thinking about usernames—specifically the characters that they may be comprised of.

Continue Reading →

RustConf 2021

A few weeks ago I got up at 2:30am and attended virtual RustConf 2021. The pre-recorded talks were live-streamed and there was a dedicated Discord server for discussion and Q&A while the talks ran. It was overall well organised and a good experience. All the talks were interesting and well executed. The Discord chat was fun but I’m not sure it added a lot to the value of my experience.

Continue Reading →

Burning 2.5Tb of Bandwidth Hosting a Nitter Instance

On 24 August I received an email from Vultr saying that my server had used 78% of its 3Tb bandwidth allocation for the month. This was surprising as last time I looked I only used a small fraction of this allocation across the various things I host.

After some investigation I noticed that the Nitter instance I set up six months ago at nitter.decentralised.social seemed to be getting a lot of traffic. In particular it seemed that there were several crawlers including Googlebot and bingbot attempting to index the whole site and all its media.

Continue Reading →

Turning One Hundred Tweets Into a Blog Post

Near the conclusion of my #100binaries Twitter series I started working on the blog post that contained all the tweets. It ended up posing a number of interesting challenges and design decisions, as well as a couple of Rust binaries. Whilst I don’t think the process was optimal I thought I’d share the process to show my approach to solving the problem. Perhaps the tools used and approach taken is interesting to others.

Continue Reading →

One Hundred Rust Binaries

I recently completed a #100binaries series on Twitter wherein I shared one open-source Rust tool or application each day, for one hundred days (Jul—Nov 2020). This post lists binaries 1–50. See page 2 for binaries 51–100.

Continue Reading →

Slowing Down Read Rust Posting

After nearly 3 years and more than 3200 posts I’m going to slow down the posting frequency on Read Rust. I hope this will free up some spare time and make it easier to take breaks from social media. I aim to share all of the #rust2021 posts I can find, but after that I’ll probably only share posts that seem particularly noteworthy or interesting.

Continue Reading →

Working Around GitHub Browser Sniffing to Get Better Emoji on Linux

I have my system configured[1] to use JoyPixels for emoji, which I consider vastly more attractive than Noto Color Emoji. Sadly GitHub uses browser sniffing to detect Linux user-agents and replaces emoji with (badly aligned) images of Noto Color Emoji. They don’t do this on macOS and Windows. In this post I explain how I worked around this.

Continue Reading →

Setting the amdgpu HDMI Pixel Format on Linux

This week I discovered some details of digital display technology that I was previously unaware of: pixel formats. I have two Dell P2415Q displays connected to my computer. One via DisplayPort, the other via HDMI. The HDMI connected one was misbehaving and showing a dull picture. It turned out I needed to force the HDMI port of my RX560 graphics card to use RGB output instead of YCbCr. However, the amdgpu driver does not expose a means to do this. So, I used an EDID hack to make it look like the display only supported RGB.

Continue Reading →

Software Bounties

I don’t have time to build all the things I’d like to build, so I’m offering bounties on the following work.

Continue Reading →

Comparing Alternatives to top Written in Rust

Recently I aliased top to ytop. Then I became aware of bottom, and zenith. These are all terminal based system monitoring tools that you might use instead of top. In this post I set out to compare them.

Screenshot of ytop, bottom, and zenith while building some Rust code
Left to right: ytop, bottom, and zenith.
Continue Reading →

New Design 2020

It’s been more than 10 years since I started working on the previous design for this website 😅. This feels like a good point to come up with a new one!

Continue Reading →