Screenshots The RSS feed for Screenshots.

  • πŸ“˜ Devlog

    Blogging Tools - Podcast Clip Favourites

    Working on saving podcast clips from Blogging Tools into a Hugo site, done in the “lab notes” running commentary approach. Continue reading β†’

  • Small change to the thirst mechanic for my Godot project. Switched from discrete thirst levels to a single timer that will tick down if the player is thirsty. This allowed for a change to how I indicate this to the player, replacing text messages that’ll be displayed at each thirst level with a gauge that shows up on the HUD.

    Auto-generated description: A retro-style video game features a knight-like character navigating a platform with a floating pink enemy and a water obstacle below.

    I thought that the messages would be enough, but after playing through with them, they turned out to be more of a hindrance. They didn’t communicate the player’s thirst level well enough: they show up for a few seconds, then disappear, leaving the player to wonder how much time they have. This information is now always present with the gauge. Plus, I think it gives more of a sense of urgency, in that a gauge that’s constantly ticking down will encourage the player to play a little faster in order to reach the next water bottle before they perish from thirst.

  • More on that Godot project today. Finally bit the bullet and started working on proper backdrops. I’ve leaving the artwork until later (i.e. I’m procrastinating), today was all about the mechanics, trying to get parallax scrolling working. Fortunately Godot has built-in nodes to make this easy, although I did have to upgrade Godot to 4.5.

    This is my first cut, some simple colour banding to represent sky and sand in one of the desert levels:

    Auto-generated description: A pixel-art game interface shows a character in armour on a blocky terrain with a blue sky background and floating coins.

    These two layers were added to the scene as Parallax2D nodes, each with a single Sprite child. Positioning the sprites was a little tricky. Godot suggests placing them at the origin, but what I didn’t understand was that the actual position of the sprite depends a lot on the scroll scale of the Parallax2D node. I added the sky layer without changing the scroll position and it took me a while before I discovered that it was appearing below the camera. Only after reducing the scroll scale to about 0.1 did it start showing up in the viewport (one nice thing about Godot 4.5 is that the “play scene” window includes debug options, allowing you to hijack the camera and move it around the scene).

    Auto-generated description: A game development interface is displayed, featuring a pixelated game scene with water and blocks being edited in an application, likely Godot Engine.

    I will need to introduce some detail in the backdrop layers soon. The bands are too simple and may induce some vertigo when the player is ascending to high platforms. Plus, it just looks boring. Not that they’re meant to be eye-catching but something a little more interesting would be nice.

  • Just a reminder that MacOS comes with a grapher, and a pretty decent one at that. Came in handy when I wanted to visualise a few functions.

    Auto-generated description: A graphing software interface displays the function (y = cos(x^2) + 0.5) plotted on a Cartesian coordinate system.
  • πŸ“˜ Devlog

    Trying OpenAI Codex to Produce Freelens Logo Creator

    Using OpenAI Codex to make a logo generator tool to allow customisation for different clusters in Freelens. Continue reading β†’

  • A Bluesky modal announcing the released of saved posts, along with a post humorously suggests creating a Saturday that follows immediately after Monday, displayed above a section for saving posts. Modal message is as follows: Finally! Keep track of posts that matter to you. Save them to revisit any time.

    Finally indeed.

  • Ah, MacOS’s locked-down nature strikes again! Was testing the CI/CD build for Dequoter and after downloading the artefact and attempting to open it, I got this warning message:

    Auto-generated description: A warning dialog box states that Dequoter is damaged and suggests moving it to the Bin, with options to cancel or proceed.

    Turn’s out it was being quarantined by MacOS, and these instructions resolved the issue:

    xattr -dr com.apple.quarantine '/Applications/Your Application.app'
    

    The binaries not notarised so I wasn’t expecting it to work out of the box. I was hoping that it would do that thing where the app will be listed in settings and I can allow it to launch from there, but I guess there’s something about where this file came from that was too much from MacOS. Ah well, I can live with this for the short term.

  • Speaking of Dequoter, in “celebration” of the upcoming release of MacOS 26, I styled the command palette a little, adding a transmissive blur to give it a glass effect:

    Auto-generated description: A text editor on a computer screen shows a command tool over a block of text, with options like Unquote and Format JSON.

    It’s a shame I can’t style the options of the select element. It would be nice to increase their margins a bit.

  • πŸ“˜ Devlog

    Dequoter β€” Something Different Today

    A new project called Dequoter was started to unquote a JSON string and filter it, utilizing Go for backend functionality and HTML for the frontend. Continue reading β†’

  • I saw someone online mention Zo Computer so I though I’d give it a try. Asked it to produce a Go function based on one of my blog posts, since I needed the same thing in a different project. I saw it open the blog post and generate the function in about 5 seconds.

    Auto-generated description: A computer screen displays a coding interface with a task description and a code editor, focusing on implementing a Go function related to a PostgreSQL database.

    Granted that this is hardly groundbreaking. It’s using GPT 4.1 mini, so it’s likely I could’ve done the same thing straight from ChatGPT. But I think it’s a good first step in seeing what this service is capable of.

    I also wonder if the model is actually consuming the post. I have nothing to support this other than doubt that the post would be in GPT 4.1’s training data. The URL can’t be more than a month old.

  • Starting to work on the background tiles. This is what I have so far. I hope it’s not too busy or distracting.

    Auto-generated description: A pixelated video game scene features a character in knight armor navigating a stone brick environment with a wooden crate and a collectible item.
  • It’s not unheard of to have animals, usually kangaroos, on our line near the down end where it’s quite bushy. But this is well within the inner city. I wonder what it could be. πŸ€”

    A notification from Metro Notify alerts about a delay on the Hurstbridge line due to an animal on the tracks at West Richmond.
  • πŸ“˜ Devlog

    Godot Project β€” Bricks in Level 2-3 Laid

    Just a quick update today. I’ve finished all the brickwork in level 2-3. And it didn’t go too badly. Made one significant mistake which would’ve involved a lot of rework, that I patched up with some single tiles:

    Auto-generated description: Two sections of a pixelated game map featuring stone walls, an arched door, and orange blocks resembling platforms.
    Top: the mistake. Bottom: the fix.

    Doing the rest of it was pretty dreary work. Godot does have some tools to make this easier, but there was no getting around the level of care needed to place the bricks correctly. But it’s all pretty much done now. And just for comparison to the before screenshots I took when I started, here’s how how the level looks now:

    Continue reading β†’

  • πŸ“˜ Devlog

    Shutting Down Nano Journal

    With the move to Obsidian for my journalling needs, I shut down my bespoke journalling web-app. I deployed it on 26th August 2024, which makes it just over a year old. I did start using Obsidian on the 20th though, so it didn’t quite make it the entire year. Even so, not bad for something hand made and somewhat neglected. Most things I eventually abandon last way less than that.

    Continue reading β†’

  • πŸ“˜ Devlog

    Godot Project β€” Level 2-3 Update

    Critical path for level 2-3 has been built. Continue reading β†’

  • It’s always something with NPM, isn’t it:

    Auto-generated description: A terminal interface shows a series of error messages related to installing dependencies, including error code ENOTEMPTY and directory issues.

    Here’s an idea: why don’t YOU rename that directory, NPM?

  • πŸ“˜ Devlog

    Blogging Tools β€” All About Images

    Some recent changes to Blogging Tools around images and image processing. Continue reading β†’

  • 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. Continue reading β†’

  • 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. Continue reading β†’

  • πŸ› οΈ 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. Continue reading β†’

  • πŸ“˜ 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. Continue reading β†’

  • 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. Continue reading β†’

  • Brief Look At Microsoft's New CLI Text Editor

    Kicking the tyres on Edit, Microsoft’s new text editor for the CLI. Continue reading β†’

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

    Continue reading β†’

  • πŸ“˜ 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.

    Continue reading β†’

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

  • Tried opening my Godot project this morning and was greeted with the following error:

    Auto-generated description: A computer screen displays a development environment with an error message pop-up about an invalid or missing scene file.
    scene/resources/resource_format_text.cpp:284 - res://scenes/falling_platform.tscn:14 - Parse Error: 
    Failed loading resource: res://scenes/falling_platform.tscn. Make sure resources have been imported by opening the project in the editor at least once.
    Failed to instantiate scene state of "res://scenes/falling_platform.tscn", node count is 0. Make sure the PackedScene resource is valid.
    Failed to load scene dependency: "res://scenes/falling_platform.tscn". Make sure the required scene is valid.
    

    Traced it back to the technique I was using to respawn the falling platform. Looks like Godot didn’t like the two preloads I included:

    # file: scripts/falling_platform.gd
    
    @onready var FallingPlatform = preload("res://scenes/falling_platform.tscn")
    @onready var FallingPlatformScript = preload("res://scripts/falling_platform.gd")
    

    This resulted in a parse error and Godot thinking the level scene was corrupted. In retrospect, this kinda makes sense. What I doing was technically a circular dependency, where the scene and script was trying to preload itself. I was hoping Godot was smart enough to recognise this, but I guess not.

    So I had to change the respawn code. I modified it to make use the duplicate method. Here’s the revised version:

    func respawn():	
        var dup = self.duplicate()
        dup.global_position = init_global_position	
    
        # Duplicate also copies the velocity so zero it out here
        dup.velocity = Vector2(0, 0)
        get_tree().current_scene.add_child(dup)
    

    After some limited testing, this seems to work. One good thing about this approach is that it looks like duplicate copies the script, so I no longer need to do anything special here.

    So I guess the lesson here is don’t try to preload the script within itself.

  • Adventures In Godot: Respawning A Falling Platform

    My taste of going through a Godot tutorial last week has got me wanting more, so I’ve set about building a game with it. Thanks to my limited art skills, I’m using the same asset pack that was used in the video, although I am planning to add a bit of my own here and there.

    But it’s the new mechanics I enjoy working on, such as adding falling platforms. If you’ve played any platformer, you know what these look like: platforms that are suspended in air, until the player lands on them, at which point gravity takes a hold and they start falling, usually into a pit killing the player in the process:

    Continue reading β†’

  • πŸ”— cathoderay.tube

    Auto-generated description: A web browser window displays the word computers!!! in large text on a plain white background.

    Yes.

  • Running PeerTube In Coolify

    A guide for setting up a basic PeerTube instance on Coolify using a docker-compose file. Continue reading β†’