home ¦ Archives ¦ Atom ¦ RSS

Last Tea Shop Complete

L. M. Orchard had an intriguing reference to a narrative table top role playing (TTRP) game, entitled Last Tea Shop Complete

Last Tea Shop Complete is a revised and expanded version of a one-page solo game about tea and conversation. Set up your stall and wait for visitors to emerge out of the mist. Over a cup of tea, chat to the visitor about their life and help prepare them for their trip into the Lands of the Dead. Record their thoughts, fears, dreams and hopes in your journal for posterity.

Orchard put this in a category of solo journaling games. Considering myself a connoisseur of good narrative and a halfway decent writer, this might be a way to cut down on screen time and exercise the creative muscles.

Here’s a quick Kagi search discovery for a definition from Tina Alberion

Solo journaling games are incredibly diverse, but their unifying elements are prompts and recording/documenting. Many solo journaling games allow the player to determine their journaling method. Some strongly recommend a specific method for thematic purposes (like voice recordings for Call Your Exes), but for the most part, players may use a journal, voice or video recordings, or even just their imagination to play.

And a deeper dive from Jordan Rocke

What is a Solo Journaling TTRPG?

OK, so what are they? Basically, it’s a sub-genre of TableTop Role Playing Games (like Dungeons & Dragons, etc). TTRPGs are games where you tell a story with some friends, using some external element to determine how successful you are at doing what your character wants to do. That’s normally dice, but coins, playing cards, tarot cards and other elements are slowly entering the field.

The issue with games like Dungeons & Dragons, and basically all the other big name RPG systems, is that they only function as multiplayer games. Clearly, as being an adult is scheduling hell, a lot of people hit the point where they wanted to try playing games that weren’t reliant on a group of busy people finding time and energy to play. Enter solo TTRPGs! …

Instead, let me try to sell you specifically on solo journaling RPGs! The premise is simple: you are writing an account of your experiences from the perspective of a fictional character. The normal format is that you are given a prompt, and have to write a short (or sometimes long) passage to respond to it. The line between TTRPG and creative writing exercise is a little murky, but it’s fun all the same. The specific ways these games work varies A LOT, and it’s a little difficult to actually summarise in any way that covers all solo journaling RPGs. So, let me take you through some of the games I’ve tried, and maybe you’ll see something interesting!

I think I’ve found a new rabbit hole to fall into.


Hone, Enamored

I’m not huge on affirmations. Lean more towards stoicism than positivity spiritually manifesting success. On a daily basis, though, I try to mentally hold on to a few concise phrases for motivation and emotional guardrails. Shorter is better, and singular words are often best.

Today, I became enamored of the verb hone, defined in Wiktionary as:

Verb

hone (third-person singular simple present hones, present participle honing, simple past and past participle honed)

  1. (transitive) To sharpen with a hone; to whet.
  2. (transitive) To use a hone to produce a precision bore.
  3. (transitive) To refine (a skill especially) by learning.
  4. To make more acute, intense, or effective.

The last two meanings resonate. Moment to moment, I’m working to refine myself into a more acute, intense, and effective instrument. Added to the kit.


TIL: Click Context Parameter Source

TIL that click, my favorite CLI processing toolkit, has a mechanism to determine how a CLI option was provided Context.get_parameter_source

Get the source of a parameter. This indicates the location from which the value of the parameter was obtained.

This can be useful for determining when a user specified a value on the command line that is the same as the default value. It will be DEFAULT only if the value was actually taken from the default.

Via Stack Overflow


MacWhisper

I’m probably going to spring for MacWhisper Pro.

Quickly and easily transcribe audio files into text with OpenAI’s state-of-the-art transcription technology Whisper as well as Nvidia Parakeet. Whether you’re recording a meeting, lecture, or other important audio, MacWhisper quickly and accurately transcribes your audio files into text.

It got solid marks from Simon Willison. Vincent Warmerdam is only using the free version, but he’s got MacWhisper wired up to a programmatic keyboard. Both gentlemen have good taste in my eyes.

Initially, I’d use it like Warmerdam for agentic coding. If it can be CLI automated, it could become an essential part of the retrocast pipeline.


Some Recent eBooks of Note

Herewith, some recommendations of independently published eBooks. If you’re inclined to shop small, give these authors a shout.

Adam Johnson is a Django project committer. He’s written multiple books on DX or “development experience” in my book. Instruction on how developers can improve their experience using certain development tools.

First, the older Boost Your Git DX:

This book covers the best command-line Git tools, techniques, tips, tricks, and tactical tidbits I’ve encountered from over a decade of using Git. The selection reflects my preferences for well-maintained tools that provide high value with little need for customization.

Note that this book is not an introduction to Git and assumes that you’re already using Git on a daily basis. It offers ways to improve your developer experience with Git that ultimately help you code faster.

I bought it a while back and read it end-to-end. Since I’m a magit user on a minute-to-minute basis, much of it wasn’t directly relevant. But I learned a lot about Git, and there are some recommendations I need to implement for those actual terminal interactions with the Git CLI.

Second, the newer Boost Your GitHub DX:

This is a book about using GitHub more effectively, touring you through the fundamental features with my experience-based commentary. It covers settings, keyboard shortcuts, hidden features, syntax, techniques, CLI commands, and even improving your writing. These tools will help you collaborate more effectively with your team and deliver higher-quality software faster.

This book is aimed at anyone using GitHub daily, assuming you have some familiarity with GitHub and Git and want to go deeper.

Purchased but not yet read. As I attempt to push more development onto agentic coders, I’m using GitHub as the central platform to coordinate with systems like Claude Code, Codex, and Gemini. Specifically, I want to heavily leverage issues and PRs to track feature implementation. I bet Adam’s book will come in handy, especially in taking advantage of the GitHub CLI tool.

Third, Michael Kennedy’s Talk Python in Production:

Welcome to Talk Python in Production, a hands-on guide for Python developers determined to master real-world deployment and infrastructure management. Have you ever felt locked into pricey cloud services or struggled with overly complex DevOps configurations? This book’s stack-native approach offers a refreshing alternative.

You’ll learn to containerize Python apps, secure them with NGINX, tap into CDNs for global performance, and manage everything on a single, powerful server, without sacrificing reliability. Along the way, you’ll see exactly how we evolved Talk Python’s own web infrastructure over many years of practical deployment experience. This isn’t just theory: discover cost-saving tips, real-world examples, and step-by-step tutorials you can put to use right away. By the end, you’ll be confident in running your Python applications at scale, with minimal cloud lock-in and maximum control over your technology stack.

My primary interest here is in self-deploying HTTP traffic analytics and uptime monitoring. I’ve got multiple sites on the web and a minor interest in understanding visitors to one or two. I’ve plunked down for Kennedy’s book and am looking forward to getting stuck into it. Full disclosure: I’m a TalkPython fanboy, having bought the course bundle multiple times and listen to the podcast often, along with PythonBytes.


Anthropic’s Claude Code Best Practices

Link parkin’: “Claude Code: Best practices for agentic coding”

Claude Code is a command-line tool for agentic coding. This post covers tips and tricks that have proven effective for using Claude Code across various codebases, languages, and environments.

In particular, I’m looking at extending my own Claude Code environment as documented in this piece to integrate the GitHub CLI.

For repeated workflows—debugging loops, log analysis, etc.—store prompt templates in Markdown files within the .claude/commands folder. These become available through the slash commands menu when you type /. You can check these commands into git to make them available for the rest of your team.

Custom slash commands can include the special keyword $ARGUMENTS to pass parameters from command invocation.

For example, here’s a slash command that you could use to automatically pull and fix a GitHub issue:

I need to do some research on whether this approach or Agent Skills is better. Maybe this note from the skills docs will solve the question:

How Skills are invoked: Skills are model-invoked — Claude autonomously decides when to use them based on your request and the Skill’s description. This is different from slash commands, which are user-invoked (you explicitly type /command to trigger them).


TIL: opencode

TIL opencode:

The AI coding agent built for the terminal

OpenCode is fully open source, giving you control and freedom to use any provider, any model, and any editor.

As someone who has used Claude Code CLI, Codex CLI, Gemini CLI, and aider, seems like a no-brainer to give opencode a test drive. The only hesitation is the terminal program requirements:

Prerequisites

To use OpenCode, you’ll need:

A modern terminal emulator like:

WezTerm, cross-platform

Alacritty, cross-platform

Ghostty, Linux and macOS

Kitty, Linux and macOS

API keys for the LLM providers you want to use.

I’m quite happy with iTerm2. These are all advanced variations on a terminal, typically with accelerator driven graphics and/or AI integration. Sounds wonderful but a bit heavyweight for me. Hopefully the “like” is applicable to iTerm2.

Via Alex Ellis. His prototype Code Review Bot post is worth a shout as well.


KuzuDB and LadybugDB

KuzuDB is a professional take on a graph database engine. Also embeddable so sort of like SQLite for graph and vector data.

Unfortunately, the company behind the open source project, up and pulled stakes according to The Register. One of the more annoying possible outcomes of a VC backed project (c.f. Marimo).

The KuzuDB embedded graph database, open source under the MIT license, has been abandoned by its creator and sponsor Kùzu Inc, leaving its community pondering whether to fork or find an alternative.

A few days ago, the GitHub project was archived and a note appeared stating that “Kuzu is working on something new.” In addition, the documentation and blog post archive were moved from the Kuzu website to GitHub.

Since the project was developed with a generous open source license, forking was quite an eminent possibility. Enter LadybugDB:

LadybugDB is a modern graph database designed with a primary focus on object storage. Unlike traditional databases that treat storage as an afterthought, LadybugDB places object storage at the core of its architecture, enabling efficient management of complex, interconnected data structures while maintaining the flexibility and scalability that modern applications demand.

Built on top of KuzuDB, LadybugDB inherits a robust and modular implementation of cypher. KuzuDB was previously developed by Kùzu Inc.

Here’s the repo. The emphasis on object storage takes it in a bit of a different direction though. Now moving into DuckDB territory.


Apple Music APIs

Work on my scrobbledb project has been moving along. As scrobble and track metadata archiving solidifies, the eye turns to how to exploit that data. Given my predilection to DJ mixes on Apple Music, I became curious on what was available to leverage Apple’s music streaming service. Turns out quite a bit.

First off, the Apple Music API

Use Apple Music API to access information about media in the Apple Music Catalog and a user’s personal iCloud Music Library.

  • Apple Music Catalog includes all resources available in Apple Music.

  • iCloud Music Library contains only those resources the user adds to their personal library. For example, it contains items from Apple Music, songs purchased from iTunes Store, and imports from discs and other apps. This library can include content that’s not in the Apple Music Catalog.

Use this API to retrieve information about albums, songs, artists, playlists, music videos, Apple Music stations, ratings, charts, recommendations, and the user’s most-recently played content. With proper authorization from the user, you can also create or modify playlists and apply ratings to the user’s content.

Matt Palazzolo put together a Python module for the Apple Music API, docs, focused strictly on the catalog. Apparently accessing a user’s iTunes library is a hairier prospect.

Interestingly, the Apple Music API docs point to a bulk metadata download service the Apple Music Feed.

Apple Music Feed contains the catalog content of Apple Music products in bulk for consumption as feed exports. These bulk exports are appropriate for offline use cases, complementing Apple Music API, which is best for online use. Apple Music Feed includes content metadata for albums, songs, artists, and popularity charts, and fully refreshes every 24 hours. You access the Apple Music Feed using Apple Media Feed API to request an export of a data set.

With access to the raw data and the information in this documentation, you can use Apple Music Feed in many ways. For example, if you want to build a discovery engine for Apple Music, your team can examine the data and determine endpoint requests to serve such an engine.

Apple itself provides code examples for the Music Feed.

Clearly this will be relevant to building on top of scrobbledb. Also, seems like a possibility for an MCP server


op and direnv

1Password has a great command line interface (CLI) framework. As my secrets manager of choice, I like to keep API keys in 1Password.

Meanwhile, I also use direnv to automagically establish environment variables in project directories. AI toolkits typically pick up their API keys via environment variables. OPENAI_API_KEY is the canonical example. Direnv picks up the variables to set up via a .envrc file.

Being super lazy, I’d rather not cut and paste from 1Password to append the right information to .envrc. I thought of writing a script from scratch, but then started poking around on the web. Then there’s this interesting comment on GitHub in a repository about connecting direnv and 1Password:

I just found out that you can just do this in .envrc, so I’m actually not sure what’s the main benefit of the plugin if that already works. Maybe I’m missing a use case though.

export MY_SECRET=${MY_SECRET_2:-$(op item get 'db/some-database' --fields password --format json | jq -r .value)}

I asked Claude to turn that one-liner into a script and wound up with this:

#!/bin/bash

# Usage: ./set-env.sh ENV_VAR_NAME OP_ITEM_SPEC [FIELD]

ENV_VAR="$1"
OP_ITEM="$2"
FIELD="${3:-token}"

if [ -z "$ENV_VAR" ] || [ -z "$OP_ITEM" ]; then
    echo "Usage: $0 ENV_VAR_NAME OP_ITEM_SPEC [FIELD]"
    exit 1
fi

EXPORT_LINE="export ${ENV_VAR}=\${${ENV_VAR}:-\$(op item get '${OP_ITEM}' --fields ${FIELD} --format json | jq -r .value)}"

# Check if the variable already exists and update/insert
if grep -q "^export ${ENV_VAR}=" .envrc; then
    # Update existing line
    sed -i.bak "/^export ${ENV_VAR}=/c\\
${EXPORT_LINE}" .envrc
    echo "Updated ${ENV_VAR} in .envrc"
else
    # Append new line
    echo "${EXPORT_LINE}" >> .envrc
    echo "Added ${ENV_VAR} to .envrc"
fi

Next up, hand this off to Claude Code Web to turn it into a Python CLI tool. I’d like to have more introspection and interactive selection of keys.

Generating a Bash script, test driving, then handing off to Claude Code for conversion to Python seems to be a development process that works for me.


Claude and Discipline

From the end of a 3 part series by Sam Ruby Disciplined use of Claude

Reading Reddit and other places, I see lots of people have had problems with Claude, mostly rate limiting and hallucinations. This most definitely has NOT been my experience. I’m on the Claude Max 5x plan, I’ve used it hard for several months with no issues, particularly since Sonnet 4.5 was released. Many have identified strategies making use of various tools and agents. Other than creating a CLAUDE.md file and starting to experiment with skills, I have done none of this.

What I bring to the equation is domain area expertise and discipline. What Claude brings is a broader area of expertise and raw speed, both in analyzing and coding. As I mentioned, others employ various tools to make Claude take a more disciplined approach, Sequential Thinking seems highly recommended, but as I said, I have not had any need or experience with any of this.

The components of discipline are simple: plan, document, and test.

As I’ve been getting in more reps with Claude Code, I’ve independently followed a similar trail to Ruby. I spend a significant amount of time creating plan documents, having the coding agent generate plans along with implementation summaries, and making the agent process error messages to create tests. Helpful confirmation since he’s a way better developer than I am.

Apropos of nothing, feels like I’ve been reading Sam’s work for ages. He was a very early, high quality tech blogger, especially around RSS. He seems to have come back to the trade after exiting a stint with fly.io which is great. Courtesy of him, TIL about Vector. That’s for another post though.


convert2json

Link parkin’: convert2json, GitHub repo

Utilities for use on the command line to convert BSON, CBOR, CSV, INI, MessagePack, Plist, RSV, TOML, XML, & YAML to JSON. For each supported format, there is a tool for use in a pipe as well as a wrapper that passes the converted input or files in the arguments to jaq or jq for further querying and processing.

This is one of the few tools I’ve seen that’s both fast and reasonably error-resistant for converting XML to JSON.

I have a work in progress repository for turning Discogs Data Dumps, which are big to ginormous, into a DB ingest-friendly format. The dumps are in XML. The goal is XML —> JSONL —> Parquet —> DBs. discogs-xml2db is written in Python, and to date, I have only been able to get it so robust (old datasets are sketchy with mojibake and ill-formed XML) and performant (newer datasets are gigabytes of compressed XML). I’m going to give a coding agent a chance, but I’m not all that hopeful.

In the event that route doesn’t pan out, I’ll fall back to wrapping convert2json, crate, or binary CLI within a Python module. It could be an interesting experiment just by itself.


copyedit_ai

Speaking of personal projects, I wandered off on a sidequest to create my own CLI tool for copyediting my text. The idea is to have something that can take text in, prompt an LLM to proofread, and ship the result back. Following UNIX norms, the baseline is to read and write to standard input and standard output. After that, it’s bells and whistles.

read more ...


Modernizing loguru-config

Over the past year or two, I have acquired a taste for loguru, which has excellent documentation, for logging in Python:

Loguru is a library which aims to bring enjoyable logging in Python.

Did you ever feel lazy about configuring a logger and used print() instead?… I did, yet logging is fundamental to every application and eases the process of debugging. Using Loguru you have no excuse not to use logging from the start, this is as simple as from loguru import logger.

Also, this library is intended to make Python logging less painful by adding a bunch of useful functionalities that solve caveats of the standard loggers. Using logs in your application should be an automatism, Loguru tries to make it both pleasant and powerful.

One thing that the loguru package didn’t have out of the box is a way to do configuration from a file. I went poking around on the ’Net and found a somewhat moribund loguru-config package. Support for TOML files was particularly attractive.

Loguru-config is a simple configurator for the Loguru logging library. It extends the functionality of Loguru by allowing the user to configure the logger from a configuration file. This package provides a much-needed feature to Loguru, which is the ability to configure the logger from a configuration file (for example, using loguru alone, one can’t automatically configure the logger to write to sys.stdout or sys.stderr from within a configuration file).

The configuration can have syntax similar to the one used by the native logging library in Python (i.e. support cfg://, ext://, etc.), but extends it to support even more features. It can also be easily extended to support even more features quite easily (see Extending the configurator for more details).

The configurator supports parsing of JSON, JSON5, YAML, and TOML files (out of the box) and can be extended to support other formats (again, see Extending the configurator below).

No commits might have just indicated the work was finished. However, when I tried to put it to work, it didn’t play nicely with modern Python packaging (a. k. a. uv and friends). Also, the TOML package it relied on seems to have not kept up with Python releases, so was effectively end-of-life.

Thus for fun, and reps, I figured I’d try my hand using agentic coding to modernize the codebase a bit. Unsurprisingly, the package name remains the same. It’s just a fork under my GitHub account. Yeah open source! 🎉🎉🎉

For this project, I targeted Codex Cloud. The experience was pretty good even though I’ve been primed by Claude Code as a first impression of agentic coding. Somewhat annoying is the fact that the user can’t add commits to a branch shared with Codex. All of the code has to be generated via prompting the agent. That said I was able to significantly refine the package into a workable state with little effort. And I even got it to generate a bunch of example configuration documents for all of the supported formats!

I need to review the code a bit more, but I already have an existence proof of plugging this config module into another personal project. Of course I did it by simply pointing another coding agent at the URL for my repo, but on first CLI blush, things seem to be working.

If I have some spare cycles, maybe I’ll dig in to the Codex logs and assess what worked, what didn’t, and whether it increased productivity. To be honest though, even if I could have done it faster by hand, I’m not sure it wouldn’t have come out worse, and frankly it was just fun giving this new software development style a whirl.


Understand This Moment

The following from Kyle Kingsbury is powerful. Read it and share. It deserves wide distribution

I want you to understand what it is like to live in Chicago during this time.

Understand what it is to pray in Chicago. On September 19th, Reverend David Black, lead pastor at First Presbyterian Church of Chicago, was praying outside the ICE detention center in Broadview when a DHS agent shot him in the head with pepper balls. Pepper balls are never supposed to be fired at the head because they can seriously injure, or even kill. “We could hear them laughing as they were shooting us from the roof,” Black recalled. He is not the only member of the clergy ICE has assaulted. Methodist pastor Hannah Kardon was violently arrested on October 17th, and Baptist pastor Michael Woolf was shot with pepper balls on November 1st.

I spent nine wonderful years in the greater Chicagoland area. Still have extended family and friends that live there. My heart breaks that such blatant tyranny has come to an iconic American city.


Bray On Pagefind

I implemented search here earlier this year, using Pagefind. It’s been working out pretty well for me.

In a nice bit of independent confirmation, Tim Bray, a blogging hero of mine, just recently discovered Pagefind himself, 😲, and used it to replace Google for search on his own site.

Pagefind · Tl;dr: I downloaded it and installed it and it Just Worked out of the box. I’d describe the look and feel but that’d be a waste of time since you just tried it out. It’s fast enough and doesn’t seem to miss anything and has a decent user interface.

How it works · They advertise “fully static search library”, which I assumed meant it’s designed to work against sites like this one composed of static files. And it is, but there’s more to it than that; read on.

Of course Bray has plenty of thoughts on his approach and results. Definitely read on. I picked a bit of intel here:

The one thing that in the rear-view seems unnecessary is that I had to add a data-pagefind-meta attribute to the element at the very bottom of the page where the date is to include it in the result list. There should be a way to do this without custom markup. John Siracusa filed a related bug.

I’ve been desiring to have dates integrated into search on MPR but not the time to figure out. This seems like a hint on where to look.

Bottom line?

Thanks! · To the folks who built this. Seems like a good thing.

Totally agree!


Generative Art in Claude

Previously I noticed that Claude had a skill for generative art. Since I’d like to build my own, non-browser, generative art platform I haven’t put it to the test. But it does provide an avenue for experimentation.

Les Orchard also discovered the Claude skill. And he actually used the skill to create some generative art:

Anthropic recently introduced the notion of Agent Skills for Claude, which Simon Willison wrote may be “a bigger deal than MCP”. Figured I should check things out and noticed one of the example skills was for producing algorithmic art. That dovetails nicely with my own noodlings in web-based art sketches. So, I gave it a shot.

Long story short, here’s a sketch I made with Claude’s help, wrapped up as a web component that hopefully works in your browser:

Go visit the post to see the result. I actually find it quite compelling.

He documents his process along the way, which serves as a case study of using agentic coding for generative art. One thing that caught my eye was the desire to capture intermediate results. I’m not sure if there’s a good model between continuous, implicit version capture (expensive, granularity?) and explicit user version commits (human toil). Wonder if an over the shoulder agent could monitor the state of the work and intelligently prompt the user at various points for explicit confirmation?

A final thought from Orchard:

If you’d like the source, I’ve got it up on GitHub. It’s messy and it’s not groundbreaking art, but the process was gratifying. While Claude generated the bulk of the code, I didn’t just sit back: I gave it ideas, did some debugging and coding, and steered things to make it my own.


PodSearch Backstory

I don’t listen to too many episodes of Jon Gruber’s The Talk Show. When I do, I find the show’s unofficial transcripts at PodSearch, really useful.

Here’s the backstory on how David Smith brought PodSearch into the modern AI era:

Thankfully since then OpenAI has released Whisper a powerful speech-to-text engine that I can run right on my Mac and results in transcripts that are shockingly good. They aren’t quite at the level of a human transcriber but they get darn close in many instances. Getting close to the level where you could use them to grab a pull quote with only a little bit of tidying up to do.

Moreover, because I can just run this locally it is essentially ‘free’ to run, costing only my CPU time. So I can much more easily keep it up to date and incorporate the entire back catalogs of the shows I’m indexing.

The updated site can be found at podsearch.david-smith.org. I hope you find it helpful and fun to explore. You can easily search for the occurrences of particular keywords within a particular show and find the timestamp of when it was said.


Not Standing Still: Jupyter AI

Previously I’ve noted my appreciation for marimo notebooks, especially how their reactive cell model was different from Jupyter notebook. Marimo has also been developing an interesting narrative around integration with agentic coding.

In this blog we explain why agentic coding tools like Claude work exceptionally well with marimo, especially when compared to other notebooks such as Jupyter. We also share tips on how to best use Claude when working with marimo. While this blog focuses on Claude Code, you don’t have to use your terminal if you don’t want to: in a future blog post we’ll describe how marimo provides a batteries-included AI-native editor, with a best-in-class experience for working with LLMs and your data in a single development environment

However, Jupyter is an established, robust, and large ecosystem. With a lot of smart people at the forefront of data science and machine learning. So I should have known the Jupyter team would not stand still in the face of AI advances.

Enter Jupyter AI

read more ...


Carrot Weather, Meatbags

Daring Fireball’s Jon Gruber conducted an amusing interview with Brian Mueller, the developer behind Carrot Weather.

Carrot tells me my first install was a little under 4 years ago, on November 12th, 2021. Feels like it’s been much longer. I’ve probably opened it over 95% of the days since then.

Awaiting the unofficial transcript for some interesting pull quotes.

The fact that the app has personality is one of its best features. I first heard of the Will Smith / Chris Rock contretemps from Carrot.

It’s an extremely well designed, well featured, and non-intrusive app. I highly recommend it to all meatbags.


Cursor Cli

I’ve heard a lot of good things about Cursor, but thought it was another IDE with AI inside. And I am not an IDE guy.

Turns out Cursor has a CLI! From the docs:

Cursor CLI lets you interact with AI agents directly from your terminal to write, review, and modify code. Whether you prefer an interactive terminal interface or print automation for scripts and CI pipelines, the CLI provides powerful coding assistance right where you work.

Claude Code, Codex CLI, aider, Gemini CLI, and Cursor CLI. The quiver is getting mighty full. Time to get back to work.


Side Project Sage Advice

Ned Batchelder is a wise elder of the Python community. He recently offered this advice on side projects, “Forgive yourself”

My advice is: forgive yourself. It’s OK to rewrite the whole thing. It’s OK to not rewrite the whole thing. It’s OK to ignore it for months at a time. It’s OK to stop in the middle of a project and never come back to it. It’s OK to obsess about “irrelevant” details.

The great thing about a side project is that you are the only person who decides what and how it should be.

As someone who’s using side projects as “auditionware”, I need to keep this philosophy in mind.

Batchelder also plenty of other good bits of advice in that post. Especially the nugget about how “nice” becomes easier the more you do it. Gotta get the reps.

Meanwhile, just go read the whole thing.


Marimo Acquired

I haven’t extolled it too much here, but I’m a fan of what marimo has been doing in the computational notebook space. As a small, venture backed, startup it was relatively safe to root for them. Of course venture backed implies a certain space of outcomes and one of them came to pass. Marimo joined CoreWeave.

TL;DR Marimo is joining CoreWeave. We’re continuing to build the open-source marimo notebook, while also leveling up molab with serious compute. Our long-term mission remains the same: to build the world’s best open-source programming environment for working with data.

marimo is, and always will be, free, open-source, and permissively licensed.

I’m hopeful that this won’t severely impact marimo for at least two to three years. There’s a fair bit of underlying robustness and stability that could be added amongst the strong drive on features. Given similar acquisitions I’ve seen, beyond that timescale is a crapshoot. Blitzscaling startups or existing Big Tech organizations purposefully make acquisitions fundamentally different as they become further integrated. It’s sort of the point.

Of course some folks will be bent out of shape and declare “back to Jupyter!!” That’s reasonable, except from what I understand you can’t get to marimo from Jupyter.

Simon Willison puts the proper nuance on the current state of play

Give (sic) CoreWeave’s buying spree only really started this year it’s impossible to say how well these acquisitions are likely to play out - they haven’t yet established a track record.


Impressed With Claude Code Web

It’s early days but I had a really nice initial experience using Claude Code Web

Claude Code on the web runs Claude Code tasks remotely, working with code from your GitHub repositories. This article explains how it works, when to use it instead of running Claude Code in your terminal or IDE, and what workflows it enables.

Simon Willison has a post with a much more detailed interaction, but overall he seems to align with how I felt.

I used it to modernize an old repo, lastfm-to-sqlite, which ingests Last.fm scrobbles into an sqlite database. The workflow just naturally progressed from using Claude Code on the cli. Maybe I went overboard with the summaries, but I found it extremely helpful throughout the development process. My hope is that the summaries can become either archival documentation or rolled into release notes.

As I was working, the integration of Claude Code, on the Web and command line, with the GitHub CLI makes for a nice combination. My next experiment will be to see if I can sketch out some requirements in a GitHub issue, have Claude Code Web fetch it, and then churn out a solid PR. Leveraging GitHub issues and PRs as a system of record for agentic engagement with a codebase might be a best practice.

Also on my TODO list is giving Codex on the web a try.


Pygame GUI

Link parkin’: Pygame GUI

Pygame GUI is a module to help you make graphical user interfaces for games written in pygame. The module is firmly forward looking and is designed to work on Pygame 2 and Python 3.

The “Quick Start Guide” in the documentation leans on pygame CE

GitHub source repo


cargo-update

Link parkin: cargo-update

A cargo subcommand for checking and applying updates to installed executables

Handy if you cargo install tools like starship and atuin, amongst others. Was sort of surprised cargo didn’t have something like that baked in.


In Good Company: Agentic Generative Art

I was poking around in Claude’s configuration menus and noticed this:

A screen capture of the Claude desktop config menu showing a skill
for algorithmic art

Well, well, well. Claude really does have a skill for generative art. Here’s a quick quote from the skill’s markdown:

Creating algorithmic art using p5.js with seeded randomness and interactive parameter exploration. Use this when users request creating art using code, generative art, algorithmic art, flow fields, or particle systems. Create original algorithmic art rather than copying existing artists’ work to avoid copyright violations.

A skill for Claude extends the system sort of like MCP and tools but with less code:

Claude can now use Skills to improve how it performs specific tasks. Skills are folders that include instructions, scripts, and resources that Claude can load when needed.

Claude will only access a skill when it’s relevant to the task at hand. When used, skills make Claude better at specialized tasks like working with Excel or following your organization’s brand guidelines.

The Anthropic engineering blog has a deeper dive into the overall design and intent of skills:

Building a skill for an agent is like putting together an onboarding guide for a new hire. Instead of building fragmented, custom-designed agents for each use case, anyone can now specialize their agents with composable capabilities by capturing and sharing their procedural knowledge. In this article, we explain what Skills are, show how they work, and share best practices for building your own.

And if that isn’t enough for you, Simon Willison jumps in with his trademark enthusiasm, Claude Skills are awesome, maybe a bigger deal than MCP

The algorithmic-artskill relies on p5.js to implement requested pieces. This makes sense given Claude Code’s TypeScript foundation. What’s crazy to me is that the Skills mechanism adds the entirety of that previously linked markdown to the LLM context if the skill is needed. That’s a lot of tokens consumed! On the flip side, it’s a tremendous example of actual prompting for generative art in the wild.

Just more motivation to pursue new dreams of agentic generative art using Python. Oft attributed to Picasso, “good artists copy, great artists steal.” I might not be either, but I’ll definitely be examining that skill for inspiration.


Diggin’ On: Tinzo and HYPERHOUSE

I’ve had a recent bout of chasing suggestions in Apple Music DJ Mix compilations. Basically following some of those “You Might Also Like” connections at the bottom of playlists. Two new artist discoveries are Tinzo and Anna Lunoe.

Tinzo has an attractive list of compilations, which I landed on through her Jazzy House Mix. It was as advertised a well done mix of jazz flavored house cuts. Definitely off my beaten path but multiple head nodding tracks, especially Feels Good (Yeah) [Kelly G. Little Louie Parti Mix].

Siblings Tinzo and Jojo are the co-founders and resident DJs behind the New York based YouTube channel and party, Book Club Radio.

As a Queer Filipino-American, Tinzo’s music is rooted in the LGBTQIA+ experience, with inspiration drawn from house, jazz, and trance. With a diverse skill set in performance, digital marketing, and event production, Tinzo is dedicated to promoting unapologetic joy and inclusivity within the music and live events industry.

HYPERHOUSE Radio is an Apple Music residency for Anna Lunoe. According to Wikipedia, she was in on the ground floor of Apple Music!

Hosted by magnetic tastemaker and underground-club killer Anna Lunoe, Season 3 of HYPERHOUSE is all about the Sydney-born DJ’s prowess. Twice a month on Apple Music 1, Lunoe will share a 60-minute mix exploring the best in new dance and electronic music.

HYPERHOUSE: Episode 72 was just refreshingly new to me. Didn’t feature anyone I was really aware of other than TSHA (gooddess).

Between these two series and Beats in Space, there is an endless trove of DJ mixes to consume on Apple Music.


soco-scribbler: Agentic Development

I made some recent forward progress on my side quest project soco-scribbler. This is an effort to revise the sonos-lastfm project, which uses SoCo under the covers, to log track info from Sonos speakers.

The screen capture below illustrates monitoring of three speakers and track logging from one that’s actively playing. The ultimate goal is to emit the track info to other systems such as an sqlite database or a message streaming platform like nats. But just handing off to Python logging is a good start.

Screen capture of soco-scribbler running in a terminal
console

The interesting bit is that I used OpenAI’s Codex CLI to flesh out and revise my broken handwritten first cut. Here’s the task list that I prompted Codex to create.

  • [x] Rework the scribble CLI options in src/soco_scribbler/soco_scribbler.py:18 to remove Last.fm credential flow, keep interval settings, and add logging parameters.
  • [x] Convert SocoScribbler into a subclass of SonosScrobbler that sets placeholder Last.fm env vars, disables the Last.fm network, and accepts logging configuration.
  • [x] Implement helpers to ensure log storage, format timestamped entries, append to file/console, and override scrobble_track to log locally while updating history.
  • [x] Update the command body to use the new options, set interval env vars, drop credential/setup handling, and keep the monitoring loop via run().
  • [x] Validate the new CLI surface with uv run python -m soco_scribbler.soco_scribbler --help and manually confirm logging output without Last.fm submission.
  • [x] Introduce platformdirs to resolve per-user config/data directories in an OS-aware way and refactor existing hardcoded paths.
  • [x] Update documentation/help text to describe the new config directory behavior powered by platformdirs.

Not only did I subclass the SonosScrobbler class to hijack track scrobbling but I specced out a bunch of other necessary but rote tasks. After approving the plan, I just told Codex to “make it so”. Thus the xs checking off task completion. The result worked right out of the gate. There’s some subsequent human written adjustments to handle a bit of an edge case, but I think I could have just thrown the error message at Codex and it would have been fine fixing it.

Once I got up and rolling this was a quite pleasant experience. One that I might not have even given a go if not for agentic coding. As I’ve said in other venues, I’m skeptically optimistic but this decreases the level of skepticism a bit.


Pygame Community Edition

Searching my archives, looks like I first encountered pygame over 16 years ago 😲! pygame subsequently served me well for experimenting with generative art in Python.

Back in 2023, a post from Diego Crespo, about drama in the pygame community, came across my transom.

At over 20 years old, Pygame is one of the most widely used Python libraries for game development. It has inspired many beginners and hobbyists to learn Python and create their own games, including myself. It’s also used in schools for educational purposes, for quick prototyping of game mechanics, and multimedia applications. But recently it was forked2. At first this shouldn’t seem unusual, because as of the time of writing, it has over 2.6k forks. People fork open source projects all the time, to contribute code, to make their own experimental changes, or just for fun. But this fork is different, as it is led by many of the core maintainers of the original project. The forked version of Pygame is called Pygame Community Edition (Pygame CE).

At the time, I duly noted the occurrence but was off doing other things and didn’t take any action.

However, with the benefit of improvements in the Python ecosystem and my own abilities, I’m contemplating revisiting my ancient peyote repository for generative art noodling. pygame Community Edition (Pygame-ce) seems to have a lively community that’s keeping pygame up to date with the changes in Python.

Pygame is a free and open-source cross-platform library for the development of multimedia applications like video games using Python. It uses the Simple DirectMedia Layer library and several other popular libraries to abstract the most common functions, making writing these programs a more intuitive task.

This distribution is called ‘pygame - Community Edition’ (‘pygame-ce’ for short).

It is a fork of the upstream pygame project by its former core developers, and was created after impossible challenges prevented them from continuing development upstream. The new distribution aims to offer more frequent releases, continuous bugfixes and enhancements, and a more democratic governance model.

It’ll definitely have to be part of the next steps.


Agentic Coding and Generative Art

Following up on my prior musings about Python and generative art. Agentic coding could of course be part of building a Processing-like platform for Python. At the end of the day though, the actual generative code is just code.

What would agentic coding support for generative art pieces look like? On one hand, you could start very “vibe codey” with almost purely natural language expressions of what an artist wants. Spit out some code. Run a visual display. Iterate in natural language.

On the other hand, the agentic framework could assist proficient coders with leveraging underlying code features of the platform, even helping with domain specific mathematical, vector graphic, and low level pixel array manipulation (bit bliting) languages to support artistic flair.

Time for some research.


The CLAUDECODE Environment Variable

Across my personal gear, the bash login startup has a pretty florid banner generated by hyfetch. This is fine for the occasional human paced terminal shell instantiation. However, when using claude code for agentic coding there’s a Bash tool which seems to use my login profile. The banner is just junk that eats up the context token budget, so I was casting about for a means to disable it when Claude was doing the invocation. Claude swore it wasn’t using a login shell, despite evidence to the contrary. I figured with all the agentic coding excitement, surfacing a discussion of this point would be relatively fruitless straightforward. Sadly I ended up a bit disappointed.

Turns out there’s a CLAUDECODE environment variable that is set to 1 for the Bash tool. I couldn’t really find any documentation other than this acknowledgment in a GitHub issue. Thought I’d publish a note on the Web in case someone else is struggling here as well. In any event, the following bash snippet conserves a few tokens.

if [[ -z "$CLAUDECODE" ]]; then
   if [[ -x $HOME/.local/bin/neowofetch ]]; then
      neowofetch --package_managers off --package_minimal
   fi
fi

Alternatively, the Claude Code documentation indicates the ability to customize the environment through a settings.json file, thereby allowing you to define your own flag if you’d like.


More On Prek

From Hugo van Kemenade, some benchmarking of the performance of prek for managing git commit hooks:

prek is noticeably quicker at installing hooks.

⚡ About 10x faster than pre-commit and uses only a third of disk space. This 10x is a comparison of installing hooks using the excellent hyperfine benchmarking tool.

Here’s my own comparison.

Kemenade doesn’t see 10x but definitely a significant performance boost. He also provides some handy shell aliases for pre-commit and prek.


TSDProxy

Link parkin’: TSDProxy

TSDProxy is an application that automatically creates a proxy to virtual addresses in your Tailscale network. Easy to configure and deploy, based on Docker container labels or a simple proxy list file. It simplifies traffic redirection to services running inside Docker containers, without the need for a separate Tailscale container for each service.

I landed on TSDProxy via exploration of incorporating dokku into my tailnet. On cursory examination, here be dragons. The tricky bit is if you want to serve SSL traffic from a container, which then requires some DNS and cert jujitsu. There is also a dokku tailscale plugin but the same configuration caveats apply.

Seems like an adventure worth diving into.


Moderninzing Python Generative Art

Over 15 years ago, I completed a generative art hack in Python. Effectively I transliterated a work from Processing into a combination of pygame and some lower level bit manipulation libraries. Further work never got all that far into making a robust framework or re-implementing other works.

Fast forward to the current era and maybe it’s time for a revisit. Especially as I’m looking for some new themes for this blog. First off, there’s likely a free order of magnitude or two speedup that’s been gained just through processor and GPU improvements. Second, thanks to the AI bubble, the software layers for programming with accelerators in Python has vastly improved. Third, it looks like OpenGL isn’t the only way to do fast bit level graphics anymore.

Just for grins, I’ve been tasking Gemini Deep Research to create reports on how this could be done. Here’s a sample:

I. Executive Synthesis: Framework Recommendations and Performance Benchmarks

A. The Architecture of Choice: Optimal Stack for Real-Time

Generative Art The investigation into Python frameworks suitable for real-time generative art, specifically those handling large bitmap images represented by NumPy arrays, identifies an optimal stack that minimizes CPU overhead and leverages modern hardware capabilities. The most architecturally sound and performance-oriented solution centers on the use of pygfx and fastplotlib, relying on the WGPU graphics backend.

This combination is strategically superior because it addresses the constraints inherent in legacy visualization tools. Frameworks such as VisPy and Pyglet, while mature, are typically built upon OpenGL. In contrast, WGPU represents a crucial evolutionary step in graphics APIs, serving as a high-level abstraction layer that translates uniformly across modern, low-level APIs, including Vulkan, Metal, and Direct3D. Since WGPU itself is a Rust implementation with C bindings , adopting a WGPU-based library inherently satisfies the requirement for low-level language bindings while maintaining a high-level Python application interface. This architectural choice is not merely an incremental performance improvement but a foundational necessity to fully exploit the parallel processing power of modern GPUs, ensuring greater long-term stability and maximizing performance gains compared to frameworks constrained by the legacy overhead of OpenGL.

This could also be an interesting exploratory application of agentic coding. I know a bit about graphics and generative art, but I’m not an expert. Maybe I could coding-centaur my way into a useful framework in a reasonable amount of time.


Diggin’ On Mëstiza

Lately I’ve been diggin’ on DJ mixes from the fabulous duo known as Mëstiza (warning, hella glitz on their site, here’s a more accessible biography and a Wikipedia entry) Blurb directly from their site, all caps included.

MËSTIZA HAS SOLIDIFIED THEMSELVES AS A DYNAMIC FORCE IN THE GLOBAL MUSIC SCENE, SEAMLESSLY AND UNIQUELY INTERTWINING ELECTRONIC MUSIC WITH THE RICH TRADITIONS OF FLAMENCO. THEIR INNOVATIVE ARTISTRY CELEBRATES THEIR SPANISH HERITAGE WHILE CHAMPIONING FEMALE EMPOWERMENT, CREATING A VIBRANT FUSION OF MUSIC, FASHION, AND CULTURAL STORYTELLING.

Rummaging around on Apple Music I discovered their and Ushuaïa Ibiza mix sets. Outstanding blending of house and Spanish vibes. Love the stage garb as well. Now on the lookout for other live collections. Highly recommended.


prek

Link parkin’: prek

pre-commit is a framework to run hooks written in many languages, and it manages the language toolchain and dependencies for running the hooks.

prek is a reimagined version of pre-commit, built in Rust. It is designed to be a faster, dependency-free and drop-in alternative for it, while also providing some additional long-requested features.

I’ve plugged prek into a few repos and it feels like a winner.


Hopper: Python Developer Tooling Handbook

Link parkin’: Python Developer Tooling Handboook, by Tim Hopper.

This is not a book about programming Python. Instead, the goal of this book is to help you understand the ecosystem of tools used to make Python development easier and more productive. For example, this book will help you make sense of the complex world of building Python packages: what exactly are uv, Poetry, Flit, Setuptools, and Hatch? What are the pros and cons of each? How do they compare to each other? It also covers tools for linting, formatting, and managing dependencies.

Hopper’s handbook is a really rich resource. Despite the mention of other Python packaging frameworks and tools, clearly the uv wave (really Astral wave if you add in ruff and ty) landed on those shores. There’s a lot of good actionable advice. And the Explanation section has bunch of foundational, non-Astral, Python packaging wisdom. The attendant blog looks great as well.

Tim’s excellent PyBites Podcast interview episode tipped me off to the handbook.


Bootstrapping Python CLI Packages

As an avowed command line interface (CLI) guy my default approach to building new Python functionality is to write a packages that’s embedded within a CLI right from the getgo. Fortunately, Python is blessed with many packages to support this. click and typer are my gotos. I so admire click that I believe the package should be a part of the Python standard library.

I also have a few opinions regarding packaging (uv please), logging (use loguru), and configuration (platform user directories + TOML files). If you do enough of these CLIs within a certain period of time, you start to yearn for some bootstrapping automation. Recently I landed on a couple of packages that align with my preferences and could really help here.

First off is a batteries included cookiecutter for new Python packages.

There are many cookiecutter templates, but this one is mine and I’m sharing it with you. Create complete Python packages with zero configuration - including CLI, testing, documentation, and automated PyPI publishing via GitHub Actions.

Second is the typerdrive package (background from Tucker Beck)

During my time as an engineer working primarily with Python, I’ve written a a fair number of CLIs powered by Typer. One type of project that has been popping up for me a lot lately involves writing CLI programs that interface with RESTful APIs. These are pretty common these days with so many service companies offering fully operational battlestations…I mean, platforms that can be accessed via API.

I’ve established some pretty useful and re-usable patterns in building these kinds of apps, and I keep finding new ways to improve both the developer experience and the user experience. Every time I go about porting some feature across to a new or old CLI, I wish there was a library that wrapped them all up in a nice package. Now, there is typerdrive:

These are the challenges I found myself facing repeatedly when building CLIs that talk to APIs:

  • Settings management: so you’re not providing the same values as arguments over and over
  • Cache management: to store auth tokens you use to access a secure API
  • Handling errors: repackaging ugly errors and stack traces into nice user output
  • Client management: serializing data into and out of your requests
  • Logging management: storing and reviewing logs to diagnose errors

typerdrive wraps all this up into an interface that’s easy for users and developers as well.

I could see myself creating a combination of these two into a new cookiecutter with a few tweaks of my own for AI engineered CLIs and REPLs. My thanks to the fine gentlemen who authored these packages and made them publicly available.


Python 3.14 Released

Python 3.14 got released recently. The team at Astral has a good feature overview amongst the many floating around on the ’Net. The overview is admittedly tinged with a focus on uv and ruff, so getting a few differing takes is a good idea. There’s nothing in this particular Python release I’m in a rush to try out, but the progress on exploiting processor concurrency is heartening.

© 2008-2025 C. Ross Jam. Licensed under CC BY-NC-SA 4.0 Built using Pelican. Theme based upon Giulio Fidente’s original svbhack, and slightly modified by crossjam.