Hi, I'm Ray 👋 and this is where I write posts, collect links, and jot notes.

Check out my stories and photography or posts on software engineering, product development, leadership, or any other topics you might like.

See what I use or what else I'm up to now.

Otherwise, check out my latest posts, links, and notes below or subscribe to a feed.

Climbing Further Up the Stack

Buildings on a street

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.

Questions About AI

Casey Handmer:

A model I’ve long been interested in is the Corporation as a stand in for AGI. We need some non-human autonomous legal and economic entity. A corporation is just that. The Fortune 500 are already non-human super-intelligence. They operate 24/7/365 according to inscrutable internal logic, routinely execute feats of production unthinkable for any human or other biological organism, often outlive humans, can exist in multiple places at once, etc etc.

The Weekly Mind Meld

James Stanier:

The key is that you engage with your daily activities mindfully in a way that keeps your weekly update in mind. What I mean by this is that you are always on the lookout for:

  • Direct experiences that you have had that would be valuable to share with the team. This could be anything from conversations with customers to shareable summaries of closed-door meetings such as executive reviews.
  • Events that can be celebrated, such as a big project shipping, a long-standing bug being resolved, or performance improvements that have been rolled out.
  • Things that could be improved, such as an incident that happened, an inefficient process that is causing friction, or data that highlights a problem that needs to be fixed (e.g. a drop in performance or an unexpected increase in infrastructure costs).
  • Events that are happening in the near future that you want to remind people about.

How Swift's Server Support Powers Things Cloud

Vojtěch Rylko and Werner Jainek:

Our legacy Things Cloud service was built on Python 2 and Google App Engine. While it was stable, it suffered from a growing list of limitations. In particular, slow response times impacted the user experience, high memory usage drove up infrastructure costs, and Python’s lack of static typing made every change risky. For our push notification system to be fast, we even had to develop a custom C-based service. As these issues accumulated and several deprecations loomed, we realized we needed a change.

They chose to rewrite using Swift on the server.

I wasn’t prepared for the tradies next door kickstarting their week by blasting The Bodyguard soundtrack.

A Raycast Extension to Search My Blog

A screen shot of Raycast running my new extension

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.


  1. Which is handy when cross linking while writing other posts. ↩︎

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.