Posts
Pieces I’ve written.
Climbing Further Up the Stack

As Gen AI programming tools continue to develop, I’m wondering what things will look like when we remove the human from the loop.
At that point, all the code that’s generated is solely for the AI. All the human-focused concerns we care about in code disappear—it becomes a black box. The code effectively becomes another intermediate language for a new layer on the stack.
As long as the solution fulfils its requirements and fits within the constraints of security and cost for the necessary performance, we’re happy.
Code structures and data schemas don’t matter—so long as the AI can refactor them to meet new requirements as they emerge.
It reminds me of stories of when assembly programmers first saw these flash new C compilers arrive on the scene and generate all this assembly code that no human had directly written.
May
April
A Raycast Extension to Search My Blog

I’ve been looking for a way to search through the local copy of my blog using Raycast.
I ended up writing a custom extension to do it. ChatGPT helped grease the way—especially in rendering the results.
It uses a brute force grep over the files’ contents which works fine given the size of the repository.
The two main actions on the extension are opening the post in my editor and copying a Markdown link to the post1.
Here is a look at the Raycast command:
export default function Command() {
const [query, setQuery] = useState<string>("");
const [results, setResults] = useState<SearchResult[]>([]);
useEffect(() => {
if (query.trim() === "") {
setResults([]);
return;
}
try {
const posts = getAllPosts(BASE_PATH, BLOG_SUBDIRS);
const matches = searchPosts(posts, query);
setResults(matches);
} catch (err) {
console.error("Error reading blog posts:", err);
}
}, [query]);
return (
<List onSearchTextChange={setQuery} throttle isShowingDetail>
{results.map(({ file, snippet }) => {
const filename = path.basename(file);
const relativePath = path.relative(BASE_PATH, file).replace(/\\/g, "/");
// Convert to URL relative from site root based upon Hugo URL config
const relativeUrl = `/${relativePath.replace(/\.md$/, "").replace(/\/\d\d\d\d-/, "/")}`;
// Grab the title from the front matter
const fileContent = fs.readFileSync(file, "utf8");
const titleMatch = fileContent.match(/^title:\s*(.*)$/m);
const title = titleMatch ? titleMatch[1].replace(/^['"]|['"]$/g, "") : filename;
const markdownLink = `[${title}](${relativeUrl})`;
return (
<List.Item
key={file}
title={snippet.replace(/\*\*/g, "")}
detail={<List.Item.Detail markdown={`**${relativeUrl}**\n\n---\n\n${snippet}`} />}
actions={
<ActionPanel>
<Action.Open title="Open in VS Code" target={file} application="/Applications/Visual Studio Code.app" />
<Action.CopyToClipboard title="Copy Markdown Link" content={markdownLink} />
</ActionPanel>
}
/>
);
})}
</List>
);
}
And here is the full file.
-
Which is handy when cross linking while writing other posts. ↩︎
Uses Page
Inspired by uses.tech, I’ve created a uses page on here.
100 Days In

I’m over 100 days into my black & white a day project.
I inevitably end up shooting around the house and neighbourhood most days. This is forcing me to find novel perspectives on things I regularly pass. It’s also making me appreciate the different light over the course of the day.
Some days I struggle to get something good. That’s ok, photography, like most things, is a numbers game.
March in Perth
A New Domain for My Photos

I moved my photography to rays.photos.
The existing feeds and links should hopefully redirect properly.
Settling Back In
Brisbane in January
Black & White 365
I’m taking on a 365 photo challenge this year: capturing at least one black and white photo each day and adding it to my journal.
I haven’t focused on black and white photography since parting with my film cameras, so I’m excited to get back into it and hopefully improve.
Six days in, and I’m enjoying it so far.
Blue Hour
K'gari
K’gari (Fraser Island) is beautiful.
We spent a few days there between Christmas and New Years.
It was the busy season and the island was packed with four wheel drivers. It felt like there were about fifty vehicles parked up for a swim at Eli Creek while we were there. We never felt crowded though, the island is huge.
Everyone bangs on about Lake McKenzie, and for good reason, it is beautiful.
The Illumina light show was an audiovisual delight.
The island is well worth a visit.
My 2024 Playlist

Here is the 2024 edition of my yearly Spotify playlist.
You can also check out my previous editions.
And here is my Last.fm listening report for the year.