Just a reminder that coding agents have their uses beyond generating code. I used Claude today to give a once over for how a field is being used. This is not something that you’ll get from PRs: no one’s going to look at the code you didn’t change. And it’s probably not going to give me perfect coverage, but it’s better than not having it.
Full train coming into the city this morning. Might be a fluke, but with petrol prices being high and public transport being free for a month, might not be. I guess we’ll see tomorrow.
Was hoping to leave work thinking we were on top of everything. Ended up leaving work being aware of a major issue that needs to be delt with in the next day or two. Argh! Well, I guess it’s better knowing about it now before we release it.
Worried about putting stock sound effects in your game? Well, I learnt the other day that many of the sounds in the original version of Doom were from stock sound effects. So if one of the critically acclaimed games of all time do it, I think it’d be fine for your game too.
A few updates of some other projects I worked on recently.
Webtools saw some love as I needed some tooling made to make the icon easy to include in the Well Read Flutter project itself. Android expects the logo of a specific size, so I “commissioned” an Android Icon Resizer, which will take one or more PNG files, resize them to what Android expects, and prepare them in a ZIP that could be extracted at the route of the res/mipmap directory. It will also produce a small preview of the icon, rendering it in a circle so you can see how it looks on the device. It’s background savvy, layering the icon over the PNG with “background” in the filename.
My current craving of vibe-coding various tools I need to do my job continues, with an attempt to build a REST/gRPC test client.
This is motivated by my distaste with all the other clients I’ve tried. There’ve been a few, and I’ve been unhappy with each one. For one thing, they seem more heavyweight than my needs. I don’t know if this is just how they’re implemented, or it’s because the realm of HTTP request testing is complicated (It’s probably a bit of both).
Some more work on Weiro. Much of it is pretty mundane, mainly to get it to feature parity with other CMS’s out there. Yes, I know the existence of those other CMS’s make the entire project pointless. Doubly so when you consider that much of what I’m going to talk about was largely done by coding agents. It made me wonder whether it was worth writing this update at all. Well, it’s drafted up already so I may as well finish it off. At least one thing will get finished.
Okay, enough wallowing in my self-doubt. What was added? Well, categories are now a thing. These can be defined in a new categories section and consist of a label, a slug, and a description. Going to /categories/<slug> will list all the posts with that category. Posts can be in zero or more categories, which can be selected from the edit post screen. Pretty simple stuff.
The Categories section, where the user can manage categories.Editing a category.Selecting categories from within the edit post screen.The categories page as it appears on the published site.The single category page.
Another small thing added was pages. This allows the user to define “slash” pages, with the option of appearing in the nav bar, and can also be used to replace the home page, by setting the slug to / (the posts are still available at /posts). I do need to spend some more time figuring out how to organise the nav bar as I would also like to include things like redirects. I thinking of making that an extension of the pages model, but I’m not sure.
List of pages of a site.Editing a page. There’s only a single page type at the moment.
Those two features were mainly done with the help of Claude Code, but I did build some stuff manually. The largest addition was the ability to do some edits on uploaded images. I’ve never been a fan of how Apple produces the shadows around windows: the margins are just too large. So I added a way to do this within Weiro itself.
The edit upload feature.
It’s pretty simple. Just imagine the filter section from any image editor, then remove all the other features of that editor. Yeah, it’s that simple. There’s no cropping, rotating, or anything else of that nature: just a bunch of “processors” that you can add to the image, with the sole one being a drop shadow.
This is actually done server side using a simple file-based approach. When opening an image upload to edit, you spawn a session. Each session has a JSON file maintaining the processors, plus a series of cached image files of all the intermediate steps along the processing chain. When a new processor is added, a hash is computed with the processor’s properties, and if they change, the cached image will be regenerated. The processor includes the hash of the previous step too, so that if processors further up the chain are modified or remove, they will force a recompute of subsequent images. The user is then served the last image in the chain.
This differs from the image processor in Blogging Tools, which performed the transformations within the browser itself. The motivation there was to avoid the need of a slow upload of the image, but it came with the performance cost associated with doing the processing within the browser itself. WASM might be fast, but it’s not that fast[^fast]. Since the upload in Weiro is already uploaded, I figured it would be quicker to just do the image processing server side. My hope is that the computing power the server has access to would offset the time it takes to download the image. So far this seems to be the case.
Finally, I did some minor work around the UI, adding a site chooser and a much needed way to open the published site from the admin section.
So this project is still coming along, surprisingly. It’s probably the furthest I’ve got in a blogging CMS that I actually want to use. I do have a large list of things I want to add to it, and I certainly need to do something with the design of the actual site. It’s all a question of whether I’m interested in spending time on it.
[^fast]: Although to be fair, I think the slow down comes from encoding the processed image as a data URI and setting it as the source of an img tag.
Why is Hugo deadset against rendering raw, “unsafe” HTML? Look, I know this is a good default to settle on for sites where you host content written by others. But the whole point of using Hugo is to serve HTML that you yourself write. The person using Hugo owns the site the HTML is coming from.
Note to self: when reaching out to someone you don’t know, make sure to get their name right. There’s a lot of noise out there, and if you don’t get this simple thing right, you’ll be categorised as such.
After nearly a decade of daily use, new ear padding was successfully replaced on Sennheiser HD 280 Pro headphones, despite challenges during the process. Continue reading
→
Bumped the Hugo version to 0.158. If you’re reading this, then it worked. Unfortunately I had to turn off a few plugins to get it working. Please Hugo, settle on an template structure and stick with it.
I’m pretty much all in on Inkwell that I’m considering ending my Feedbin subscription. The only thing that’s keeping me there is NetNewsWire sync support, but I imagine it won’t be too long before Inkwell support is released.
Making apps shouldn’t involve needing to make business models. It should be akin to making bread. Sure you can open a bakery, but those providing the dough shouldn’t prevent you from making bread for yourself.
Never ceases to amaze me the arbitrary limits AWS puts on its resources. For example, I just learnt that the total size of a Lambda’s environment variables cannot exceed 4 KB. I mean, I’m not asking for gigabytes here, but 4 KB? Are they storing these on non-HD floppies?
Bought an umbrella a while ago that I really liked. I packed it for a walk one day, didn’t unpack it when I came home, completely forgot about it, thought I lost it, and went to buy a replacement. A couple of months ago I found it again. Now I have two umbrellas I really like.
Signal failure at Southern Cross means no trains running through the Loop. This leaves Flinders St. being the only CBD station serving my line. And yeah, it’s a tad busy.
So, Apple’s becoming more like Google (ads in Apple Maps) just as Google is becoming more like Apple (restrictions on side loading in Android). I’m all for cross-pollination but I wish they didn’t pick each other’s bad ideas.
Now that Claude Code has automated my job, I’m left with just pressing “Y” every time the agent asks me to approve something. Fortunately, there’s a way to automate that too. 😜