Screenshots

    I gotta say, I’m not digging this white-on-white button motif in Liquid Glass. It looks buggy and unfinished. A little dated too: it reminds me of the late 2000’s when box-shadows were added to CSS 3 and websites were experimenting with using shadows as borders.

    Two digital interface screenshots show a mobile email inbox with 17 unread messages and a browser displaying about:blank, both with a timestamp of 6:51 am and 6:59 am, respectively.

    Kicking the Tyres of Ollama's Native App

    Some thoughts of my experience trying out Ollama’s new native app for the first time, along with my thoughts of some of the available models.

    Moving TIL Computer To Quartz

    Moving TIL Computer from a blog-like technical stack to Quartz 4 to enhance its functionality as a knowledge repository, transitioning from a blog format to a more wiki-like architecture while integrating with Obsidian for content management.

    There was something about the appearance of iOS 26 Safari WebViews I wasn’t too sure about, and now I know: there’s a material transition between the header and the web-page, but there’s nothing separating the two. No edge, no gradient. This looks unnatural and, dare I say, a little amateur.

    Auto-generated description: A blurred web page showing techdirt.com and partial text related to a department.

    πŸ› οΈ Obsidian Plugin: Daily Notes Editor

    Displays all your daily notes in a single editor tab, much like Roam Research. This was a feature I liked about Roam, and when I first looked at Obsidian, I wish it had it. Trying it out on my personal vault, where the daily notes tend to be quite small.

    Auto-generated description: A digital document features dated notes with navigation features, modal keypresses, and task lists, displayed in a note-taking application interface.

    Some First Impressions of iPadOS 26 Public Beta

    Thoughts on Liquid Glass and Safari after 30 minutes of use.

    Devlog: Godot Project β€” Level 4-2 And Level 2-3

    Progress has been made on level 4-2, and early development on level 2-3, alongside new game elements.

    Since I’m not a huge user of iCloud, the fact that I only have 5 GB doesn’t offend me. But seeing the breakdown of my storage usage, I can understand why people think Apple is being unreasonable here. To use up 80% of the available storage and leave a measly 1 GB for personal use is not great.

    Auto-generated description: A summary of iCloud storage usage shows 4.4 GB used out of 5 GB, with details on backup, photos, and documents, and an upgrade option is offered.

    Logged into the iCloud web-portal for the first time today (I completely forgot that there was a web portal). I don’t know if this is a thing many people use, but it’s… okay. A little slow, but potentially useful for those times when you can’t access something via native apps.

    Auto-generated description: A digital dashboard displays sections for Photos, Reminders, and Mail, along with a user profile labeled Leon.

    There is also a sense that it’s a little flimsy, that if you push too hard it will fall over. Can’t quite put my finger on why that is, but I think it’s all the small, thin fonts and pale colours. Just feels a little fragile.

    Kind of wished Mail.app kept your email rules when you choose to sign out of iCloud. I did just that on my work laptop, and today I found all my rules got clobbered. Good thing I documented at least one of them, so I didn’t loose too much. But it’s still data loss, and I rather it didn’t happen.

    Auto-generated description: A computer interface displays an email rules management window, showing a single rule titled News From Apple.

    Devlog: Blogging Tools β€” Category Fixer

    Adding an RSS feed parser and in-app notifications to build a feature to triage image posts that don’t have a category.

    Brief Look At Microsoft's New CLI Text Editor

    Kicking the tyres on Edit, Microsoft’s new text editor for the CLI.

    My first automation to assist me with this “issue driven development” approach: a Keyboard Maestro macro which will activate Obsidian, go to the end of the document, and add a new line beginning with the current time.

    Auto-generated description: A configuration window for creating a new timestamped line in Obsidian, detailing trigger options and actions.

    My goal is to have one Obsidian note per Jira task, which I will have open when I’m actively working on it. When I want to record something, like a decision or passing thought, I’ll press Cmd+Option+Ctrl+L to fire this macro, and start typing. Couldn’t resist adding some form of automation for this, but hey: at least it’s not some hacked-up, makeshift app this time.

    Devlog: Blogging Tools β€” Ideas For Stills For A Podcast Clips Feature

    I recently discovered that Pocketcasts for Android have changed their clip feature. It still exists, but instead of producing a video which you could share on the socials, it produces a link to play the clip from the Pocketcasts web player. Understandable to some degree: it always took a little bit of time to make these videos. But hardly a suitable solution for sharing clips of private podcasts: one could just listen to the entire episode from the site. Not to mention relying on a dependent service for as long as those links (or the original podcast) is around.

    So… um, yeah, I’m wondering if I could building something for myself that could replicate this.

    I’m thinking of another module for Blogging Tools. I was already using this tool to crop the clip videos that came from Pocketcasts so it was already in my workflow. It also has ffmpeg bundled in the deployable artefact, meaning that I could use to produce video. Nothing fancy: I’m thinking of a still showing the show title, episode title, and artwork, with the audio track playing. I pretty confident that ffmpeg can handle such tasks.

    I decided to start with the fun part: making the stills. I started with using Draw2D to provide a very simple frame where I could place the artwork and render the text. I just started with primary colours so I could get the layout looking good:

    Auto-generated description: A date, episode title, and show name are displayed alongside an image of ocean waves against rocks in a colorful border.

    I’m using Roboto Semi-bold for the title font, and Oswald Regular for the date. I do like the look of Oswald, the narrower style contrasts nicely with the neutral Roboto. Draw2D provides methods for measuring text sizes, which I’m using to power the text wrapping layout algorithm (it’s pretty dumb. It basically adds words to a line until it can’t fit the available space)

    The layout I got nailed down yesterday evening. This evening I focused on colour.

    I want the frame to be interesting and close to the prominent colours that come from the artwork. I found this library which returns the dominant colours of an image using K-means clustering. I’ll be honest: I haven’t looked at how this actually works. But I tried the library out with some random artwork from Lorem Picsum, and I was quite happy with the colours it was returning. After adding this library1 to calculate the contract for the text colour, plus a slight shadow, and the stills started looking pretty good:

    Auto-generated description: Six rectangular cards each feature a different background image with the date 14 April 2020, text A pretty long episode title, and My test show.

    I then tried some real podcast artwork, starting with ATP. And that’s where things started going off the rails a little:

    Auto-generated description: Four color variations of a promotional card design featuring a logo with rainbow stripes, a date of 14 April 2020, and text stating A pretty long episode title and My test show.

    The library returns the colours in order of frequency, and I was using the first colour as the border and the second as the card background. But I’m guessing since the ATP logo has so few actual colour, the K-means algorithm was finding those of equal prominence and returning them in a random order. Since the first and second are of equal prominence, the results were a little garish and completely random.

    To reduce the effects of this, I finished the evening by trying a variation where the card background was simply a shade of the border. That still produced random results, but at least the colour choices were a little more harmonious:

    Auto-generated description: A series of four visually distinct cards display a logo, date, episode title, and show subtitle, each set against different colored backgrounds.

    I’m not sure what I want to do here. I’ll need to explore the library a little, just to see whether it’s possible to reduce the amount of randomness. Might be that I go with the shaded approach and just keep it random: having some variety could make things interesting.

    Of course, I’m still doing the easy and fun part. How the UI for making the clip will look is going to be a challenge. More on that in the future if I decide to keep working on this. And if not, at least I’ve got these nice looking stills.


    1. The annoying thing about this library is that it doesn’t use Go’s standard Color type, nor does it describe the limits of each component. So for anyone using this library: the range for R, G, and B go from 0 to 255, and A goes from 0 to 1. ↩︎

    Devlog: Godot Game Update

    A brief status update on that Godot game. I think we’re pretty close to a finished 4-1 level. The underground section has been built, and the level has been decorated. I’ve also added a couple of secrets, which needed a few new mechanics β€” like doorways, which are used to transport the player around the level β€” plus some refinement to existing ones. I am a little concerned about the amount of waiting involved near the end of the first half, where the player will need to make their way across a large gap by jumping on the slow cycling “layer 2” tile layer. I’ll see what feedback I get from play-testers about this.

    Auto-generated description: A pixelated, side-scrolling platformer video game scene features a knight character on a cliff with blocks, coins, and a treasure chest in view.

    I’ve also filled in the backdrop of all the levels to date. The grey default background colour has been replaced with a sky made of colour bands that came with the asset set I’m using. It’s basic, maybe too basic, but as long as it doesn’t clash with the interactive elements, and in the interest of “merely shipping something,” I think it’ll do for now.

    Finally, I made some changes from feedback I got from play-testers. Movement can now be made using WASD, along with the inverted-T arrow keys. I’ve also bound jump to the Enter key for those that want to use WASD. I made some changes in how secrets are telegraphed with the goal of making them more consistent. This is always a bit of a balancing act, as I don’t want to make them too obvious: they’re secrets after all. I added a tiny bit of “slip” to the player’s movement, so they don’t stop dead whenever the key is released. I didn’t want to go too far here: adding too much inertia introduced the risk of the player just falling off a platform after landing from a jump, which I don’t think is a great experience. And I fixed a window resizing bug (Godot enables window resizing by default, for anyone else who needs to know this).

    I think the next thing to do is to organise another version for play-testers, just to gauge what they think of level 4-1. Then it’s either on to level 4-2, or even introduce a new level between 1-1 and 1-2 to reduce the ramp up in difficulty between the two levels. Fortunately I’ve got some ideas on what I want to do for both of theses, so they’ll be easy starters. I’ve still got nothing for level 2-1, but I have a few ideas on what I want to do for 2-2, so maybe I’ll start that too.

    Does Vivaldi Mobile for Android have GIF support? Yes… I guess? Not entirely sure who’s asking. Or why. Are these the same people who want to know if Vivaldi has paid stickers or file sharing support? Is this for a hypothetical messaging app?

    Auto-generated description: A review screen for the Vivaldi Browser app asks the user to rate the app with stars and provide feedback, with additional questions about GIF support.

    Blessed be the Mail.app View menu and the option to hide the useless Apple AI priority messages. My Inbox is now slightly more sane.

    Auto-generated description: A computer screen displays a dropdown menu with various options such as Show Tab Bar and Show Priority, against a background of tall trees.

    A bit more on the Godot game this morning, this time working on background tiles artwork. Made some grey masonry tiles for the end castle sequences. Also tried some background rocks for underground areas. I’m pretty rubbish at anything organic, but they didn’t turn out too bad.

    Auto-generated description: Two rectangular pixel art frames with stone textures, one in brown and the other in gray, are displayed with matching filled versions inside them.
    Right side has the background tiles surrounded with their complementary foreground tiles on the left.

    It pains me that Forgejo’s CI “pipeline running” animation spins anti-clockwise, as if you’re going backwards in time. A metaphor, perhaps? Services get undeployed, binaries go back to the source code, projects return to their seeds of ideas. πŸ€”πŸ’­

    Oh, build’s done. Never-mind. πŸ˜€

    A commit titled 'Added the grid image processor' by user 'lmika' was pushed to the main branch with the workflow file 'deploy.yaml', with a yellow spinner spinning in an anti-clockwise direction.

    Was looking at how I could add hazards to my Godot project, such as spikes. My first idea was to find a way to detect collisions with tiles in a TileMap in Godot. But there was no real obvious way to do so, suggesting to me that this was not the way I should be going about this. Many suggested simply using an Area2D node to detect when a play touches a hazard.

    I was hesitant to copy and paste the scene node I had which handled the collision signal and kill the player β€” the so-called “kill zone” scene β€”but today I learnt that it’s possible to add multiple CollisionShape2D nodes to an Area2D node. This meant I needed only a single “kill zone” scene node, and just draw out the kill zones over the spikes as children. The TileMap simply provides the graphics.

    Auto-generated description: A game development interface displaying level design with a grid layout, tiles, and collision shapes is shown.

    This discovery may seem a little trivial, but I’d prefer to duplicate as few nodes as a can, just so I’ve got less to touch when I want to change something.

Older Posts β†’