Chris Hannah Chris Hannah

Chris Hannah

Below is a feed of all of my articles, status updates, photos, and essays, enjoy!


Clicks Communicator →

Clicks:

A new kind of mobile communicator

Designed for doing, not doomscrolling.

That tagline definitely got my attention.

Based on the design and some of the copy, it made me think it was a more focused phone.

It's noticeably smaller, there's a smaller screen, physical keyboard, single camera, and a headphone jack.

But it's marketed as a companion device?

I don't see why it couldn't be used as a primary phone, but the second-phone idea feels a bit weird to me. Maybe they're just playing it safe? Is it easier to convince people to use this as an additional device than it is to get people to switch away from an iPhone to this "communicator"?

Nevertheless, I'm still interested.

There's a possibility that this idea of a dedicated device will fit into the growing use of other dedicated devices, such as iPods, cameras, etc.

It's obviously still a smartphone, but it's at least targeted as being a dedicated communication device, rather than an all-purpose handheld computer. The question is, will that actually make a difference?

2026

I'm not a massive life planner. However, I do have a few things in my head that I want to fix/improve/accomplish in 2026. So I thought I'd write them down and publish the list here, primarily to keep myself accountable.

Theme

I remember hearing this on a Relay.fm podcast years ago, and it was about each year having a theme. Which then could be quickly used when making big or small decisions throughout the year, to keep you on track.

For 2026 I don't really have a single word, but more of a rough plan. Which I guess could also work as a "theme".

My plan is:

Focus → Growth → Productivity

I want to first focus myself, whether at home or at work. I want to find my lane.

Next up is to grow in these areas. I want to be better at work, I want more time with my family, I want to waste less time, and I want to produce more.

Which leads into the third step. I want to produce more.

These steps may seem quite silly, of course I want these things. Everyone wants more focus, growth, and productivity. But I want it in a specific order. I don't want to produce 20 side projects that no one uses, and I don't want to work on improving in areas that aren't important.

Plans

Work

I work at Ant International as a Senior Software Engineer, typically on WorldFirst products.

Most of my projects were related to the multi-currency World Card product, but I started carving out a niche with one of our systems, which I currently own. So next year I plan to spend more time on the architecture level of this project, and to work out how to grow this system[1].

But I'm not just an engineer, I also lead a team of three other engineers. This year was my first experience of leading other people, so I've definitely got areas to grow here. Primarily being able to delegate work, and to let them take projects on with full ownership.

Technology

There's not much I want to change regarding my technology usage. I will likely keep using an iPhone, and also continue using both a Mac and Framework laptop interchangeably.

In that regard, I should spend more time unifying my dotfiles for these machines, along with my work Mac as well.

Other than that, the only thing I want to change is my email.

Social Media

For social media, I sort of want to use it less, but also more.

Currently I use Mastodon, X, and Instagram.

For X it's two things, following football, and the tech/programmer community that hasn't switched to Mastodon[2].

For Mastodon, it's sort of everything else that X/Twitter was.

And for Instagram, I share the occasional photo here, but primarily it's keeping up with friends and family.

But overall, I want to spend less time reading and consuming social media, and more time with actual communication. So less endless scrolling, but maybe more writing, and definitely more talking to people.

And as for talking to people, I want to find even more cool and interesting people to talk to this year.

Projects

I don't want to say anything too crazy when it comes to next years projects. But I have two main goals:

  1. Finish and release a revamped Text Case iOS and macOS app.
  2. Release a new project.

The Text Case project has already started. I've been using Claude to clean up the code and bring it up to speed. And in the new year, I have a few ideas of what I want to add to the app.

For the other project, this is intentionally vague. I don't really care what it is, a new app, or even a web service. But I haven't finished a big project in a while. And one way to incentivise myself to both build and maintain this project is if it generates some form of income. So that's the rough plan.

Travel

I travel a lot.

In any given year, I'll end up going to various cities in the UK, a few in mainland Europe, and a sunny trip to the Canary Islands in the winter time.

But if I could just note a few ideas for 2026:

  • I want to go to Rome for the first time.
  • I want to go back to Norway. This time taking my partner and daughter.
  • If I can wrangle it through work, I want to also travel to China again.

Writing

I currently have three blogs:

You can read this post if you want more details on the split between the three. My only goal for my writing in 2026 is that I continue writing all types of content, and that I keep all three blogs active.

Listening

I haven't regularly listened to podcasts in some time. I want to explore them again, and maybe I'll find something to fill my commute time with.

Reading

This year I want to read 100 books.

But let's be honest, I plan on reading more books every year, and it doesn't really change.

So I want to focus on what I do read. And that is blog posts via RSS.

Firstly, I want to allow myself to skip more. Sometimes I feel like if I follow a site, I need to read everything from that site. I've now decided that's a waste of time, and it's a waste of mental energy. If I don't find something interesting, I'm going to follow Marie Kondo's advice.

And secondly, I want to expand what I'm reading. So now I'm becoming much quicker to subscribe to an RSS feed. Especially as I'm now releasing myself from the need to make sure I read everything.

In related news, I just went to my RSS reader and marked everything as read.

So now I've got a nice clean slate, ready for the new year.


  1. I'm only being secretive because of the industry and competitors. I'm not up to anything weird. ↩︎

  2. Sure, some people have moved to Mastodon. But the two places still have a different feel. And obviously, different people. ↩︎

Printable Year Calendar →

If you print this page, you’ll get a nifty calendar that displays all of the year’s dates on a single page. It will automatically fit on a single sheet of paper of any size. For best results, adjust your print settings to landscape orientation and disable the header and footer.

I just came across this via Hacker News. It seems to scale and adapt well to any size and orientation.

I think I may end up printing this out at work. Could be a good way to visualise the year.

My New Junior Developer, Claude

I've been using Claude Code quite a lot recently. And while it hasn't replaced 100% of my programming, it is becoming invaluable for tasks that either require too much time (I have a baby), or for things that have low ROI. E.g. I don't have hours to rebuild a new theme for my blog. But Claude can do it in a few prompts.

The primary project I've been using Claude with is this blog. It's an 11ty blog with a lot of custom formatting, so most changes require some investigation and development. So that means when I have a quick idea I want to explore, I rarely have the time or effort.

But over the past week or so, I've added quite a few updates to this blog.

Redesign

It started with a complete design overhaul. This started with a few investigative prompts to Claude on the web interface to play around with how I could redesign the home page of my blog. I wanted to transform from just showing the first page of blog posts, to something that also showed projects, and social links. It generated a static HTML file, and I was pretty impressed with it. Of course, I wanted some tweaks, but the feel of the design was very appealing. So I told it to generate a design style document that I could use to help redesign the blog.

Once I had that design style document ready, I used Claude Code to first create a plan on how to implement the design. Then I asked it to proceed with each step, so I could review in between, and ask for some small changes.

After not much time, I had a new site design that I was very happy with.

Once the site was built, it was quite easy to make small additions such as dark mode, better fonts, etc. The understanding of the code and context around what the site is still impresses me. The fact that I can say "change the nav bar on the home page to X", and it can work out what file and bit of code to change is pretty cool.

Open Graph Images

The next thing I tackled was the open graph images that are generated for each blog post, which are displayed when posting to social media. I had built something before for this, but I was never happy with it.

So first I asked Claude to redesign the image to fit with the theme's colours, ensuring that the post title, site title, and site url are in the image. It came up with something simple, and I thought it was good enough for now. It's not spectacular, but it's clear, and it fits with the site's design.

Once it was being generated, I was asking it many questions about how it could be refactored to make it faster, not always generated locally, and a few other improvements. In the end, it swapped out the existing image generation which was creating a static image for every post, for a Vercel serverless function that dynamically generates the OG image based on the post title being passed as a parameter.

Under the hood it uses Satori to generate the images. After they're generated, the images are then cached in the Vercel CDN.

Post Inbox

The next thing I asked Claude was to come up with ideas on how I could make posting to this blog easier.

At the core, every post on this blog comes from a Markdown file in a specific folder structure, with some frontmatter to control things like the permalink, layout, tags, etc. It's then deployed via Vercel after detecting changes in the Git repo.

I've had a few bash scripts that I could run locally on a computer to kickstart the process, but it still felt cumbersome.

Claude came up with a few ideas, including using a CMS which would sit on top of my static 11ty site. I wasn't really fond of that at all, as it's yet one more thing to manage. But it did suggest an "inbox" idea, which was to have a new folder that would store new posts, and then a GitHub action could be triggered, which would process this file, generate some basic frontmatter, and move to the correct directory.

That sounded like a good solution, so it went ahead and built it.

So now, if I want to quickly post something to the blog, I just need to create a Markdown file, ensuring there is an H1 header on the first line, place it in the /inbox/ directory, and push to the Git repo. This means even on my iPhone, I can use Shortcuts and Working Copy to automate it even more.

In fact, the last post on this blog was published via this Git action.

And now with this post, the inbox processing feature will also handle images. I simply gave it an example scenario of placing 2 files in the inbox folder, post.md and image.jpeg and the post contents having the image referenced as ![](/2025/12/image.jpeg). From that, it updated the script to move the images to the correct location, ensuring that the relative link will work.

Home Page Excerpts

When the home page was initially built, the blog section was just a list of titles, without any content. And while I liked the minimal style, sometimes a title can't capture the meaning of a post. So I decided I wanted a short excerpt displayed, just to give a quick feel of what the post is about.

There was a bit of trial and error to get it looking right. But in the end it looks like this:

  1. Clean up the whitespace, remove HTML tags and Markdown formatting.
  2. If content is shorter than max excerpt size (300 characters) simply use that.
  3. If the excerpt ends mid-word, cut to the previous word.
  4. If the final line of the excerpt is less than 30 characters, remove it.

I expect in the future I will add a way to add a specific excerpt divider in a post. But at least this gives me a good default behaviour.

RSS Feed Optimisation

This was a small task I completed with Claude today. I had a few different RSS feeds being generated for this blog, including a few duplicates of the main feed that were due to previous blog platform migrations.

I wanted to clean it up, so I first asked Claude to analyse what RSS feeds were being generated. It found 5:

  • Main post feed
    • index.xml
    • /rss
    • /feed
  • Tag-based feeds
    • /post.xml
    • /micro.xml
    • /essay.xml

That seemed a bit ugly to me, so I asked it to restructure to only generate 4 actual feeds:

  • /feed - All content
  • /feed/post - Just standard blog posts
  • /feed/essay - Essays
  • /feed/micro - Micro posts

Claude changed the feed generation to use these new outputs, and updated the Vercel configuration to rewrite these feeds to the older locations so nothing breaks.

At the same time, the RSS feeds were updated to follow the RSS specification.

I need to get better at email

This is probably my first goal for 2026.

My email is a mess.

I've got a few different addresses, which were meant to be for different purposes. But slowly they’ve sort of merged together into a big pile of advertising, newsletters I don't read, updates from shops I bought one thing from 10 years ago, etc.

It’s hard to cut through the noise and read email that actually matters.

As for spam, the worst culprit has to be iCloud. Any spam filtering may as well not exist. I can move an email to junk, and try to use the built-in unsubscribe tool. But nevertheless, the next day the exact same email will arrive.

Gmail isn’t as bad, but since some of the addresses are technically publicly available, they're no doubt picked up by bots.

Then, there's always the chance of a leak, or a company selling my data.

What I really want is a way to separate email from people, emails not from people but important, and the rest.

I have a "reply via email" button here on my blog, but the emails get thrown onto the pile. So I probably end up missing some emails from people, where I would have probably liked to reply and to have a conversation.

I'm not sure I'm ready to create any new email addresses. I've done that before, and I still end up in the same place. But when I get some free time, I definitely want to look into this more.

There has to be a tool that makes email usable.

Where I write on the internet

Ever since I started writing on the internet, I've had a tendency to want to constantly start from scratch, switch platforms, change domain name, etc. And this year hasn't been any different.

I've toyed with various ideas, and a few of them have actually seen the light of day. So I thought now was a good time to run through where I'm currently writing, and what to expect from each.

Code and Culture (codeandculture.uk)

This is the newest writing project of mine. It is essentially a place where I can put my more serious writing. In fact, in my plans for this blog, it should support three types of content:

  • Observations: These are more immediate reaction pieces, and quick takes on topics.
  • Thoughts: Pieces where I have started to explore an idea more deeply.
  • Essays: Long-form pieces with substantial thinking and research.

I've written some short essays in the past, and there are definitely some posts where I've really gone deep into an idea. But I wanted a clear place for my more thought-out writing. And this is it.

I published my first observation post on this blog a week ago, which is about my thoughts on when you become an adult.

Journeys Through Glass (journeysthroughglass.net)

Another site which also follows the idea of separating a category of content away from my personal blog.

This time it started as a way to clearly separate a journey of using the iPad Pro more during the iPadOS 26 beta.

However, after the iPad experiment came to a bit of a dead end, it also served as the place where I wrote about my next journey, which was to start using Omarchy on a new Framework laptop.

As the name suggests, this blog is where I will post updates on the various journeys I take through the technology I use.

Chris Hannah (chrishannah.me)

The blog you're reading now. My personal blog that has content going back to 2013.

I have to admit, it's a bit of a mess right now, and there's a bunch of old rubbish I want to clear out eventually.

But another reason why I wanted to separate some writing onto other sites, is that this is my personal blog. So it's going to be messy sometimes. It's going to be a place where I share photos, links to videos, really quick thoughts, and opinions that probably won't hold up for very long.

When I think about what I want this site to be, it's a playground. Somewhere that isn't too serious. Where things may break, posts may be deleted, and the design will be radically altered without any notice.

I want to post here more often. But my decision to use 11ty has added a bit of friction that isn't always welcome. Nevertheless, that's a problem that I'll try to fix.

My Favourite Use Case for AI

AI seems to have weaved its way into most software developers daily life, whether it's conversational advice, better autocomplete, or even just plain code generation. However, the use-case that I really enjoy is when it can speed-run boring tasks for me.

I don't use AI that much when programming. For me, I prefer it to complete little side quests for me than to get involved in my main work.

My recent use case was for this blog. I change up how I write and publish posts quite regularly, depending on the computer, and tools I want to use. So while I'm using Omarchy on my new Framework laptop, I'm more terminal-heavy than before. So ideally, I'd be able to run a quick shell script on my laptop, and then jump into writing a blog post.

So I gave Perplexity my idea, and then let it come up with a simple bash script to do that very job for me.

#!/usr/bin/env bash

# Exit if no title is provided
if [ -z "$1" ]; then
  echo "Usage: $0 \"Post Title\""
  exit 1
fi

# Get current date parts
YEAR=$(date +%Y)
MONTH=$(date +%m)
DATE=$(date +%Y-%m-%d)

# Input title
TITLE="$1"

# Create slug (snake_case for filename, kebab-case for permalink)
SLUG_SNAKE=$(echo "$TITLE" | tr '[:upper:]' '[:lower:]' | sed -E 's/[^a-z0-9]+/_/g; s/^_|_$//g')
SLUG_KEBAB=$(echo "$TITLE" | tr '[:upper:]' '[:lower:]' | sed -E 's/[^a-z0-9]+/-/g; s/^-|-$//g')

# Directory structure
DIR="posts/$YEAR/$MONTH"
mkdir -p "$DIR"

# Filename
FILE="$DIR/$SLUG_SNAKE.md"

# If file already exists, don’t overwrite
if [ -f "$FILE" ]; then
  echo "File already exists: $FILE"
  nvim "$FILE"
  exit 0
fi

# Write frontmatter to file
cat >"$FILE" <<EOF
---
title: $TITLE
date: $DATE
tags:
  - post
layout: layouts/post
permalink: $SLUG_KEBAB/
---
EOF

# Open in Neovim
nvim +"normal Go" "$FILE"

GitHub Gist

It does the following:

  1. Takes in a single parameter, which is the blog post title.
  2. Creates any required directories.
  3. It uses that title in snake case for the filename, and creates a file.
  4. It uses the title again, but in kebab case for the permalink.
  5. Generates the rest of the frontmatter required for a standard post.
  6. Opens the new file in Neovim.

Watch it in action:

I'm sure I could have written this script myself, but I didn't want to. This is the sort of task that I put off for weeks, and maybe never get around to doing it. So being able to get AI to do this for me, makes my life much easier.


I only just thought about this, but I should probably make use of my own Text Case CLI tool, and also format the title properly. That can be in the next version.

I didn't run this far to only run this far.
—The back of a guys t-shirt in Barcelona, Spain.

I didn't get this at first, but now I really like it.

Journeys Through Glass

I'm pleased to announce a new project of mine, Journeys Through Glass. It is a new blog by myself, where I will document my journey using the iPad as a primary device. From my introduction:

Around two weeks ago, we got to see the iPad get a hint at a new life, in the form of iPadOS 26. That made me wonder if this could spark a revival of my usage of my iPad. - "The Start of a Journey"

My first few posts:

I'll still be posting here, but anything related to my iPad journey will be posted on my new blog!

Weeknote #1710

It's been a bit of a busy week at work. We're at the stage in our project where we're finalising our own functionality while also doing integration testing with a bunch of other teams and domains. A very tricky time.


Aside from work, I've been trying to get out in the garden a bit more. I've cut the lawn, overseeded where there were gaps, and tidied up some of the plants to make it look a bit more presentable. There's still more to do, but I think 30 minutes here and there will be enough.

Alongside me in the garden are some tadpoles...

My girlfriend got hold of them from someone elses pond recently, so we decided to put them in a little pond I made a while back. It's a half of a whiskey barrel, that I originally used as a plant pot, until I realised it was watertight as the plants were getting waterlogged constantly.

A few rocks, plants, solar-powered fountain later, we had a half-decent miniature pond.

I also bought five snails from eBay last year, and they've done fantastically this year. There must be hundreds of them in there now. I thought they would have started eating the plants, but the plants are still growing well and the water is always clear.

Right now, the snails are cohabiting well with the tadpoles, which have just recently started to grow legs!

I'm very much looking forward to my frog army this summer.