π The Writer's Journey: Mythic Structure for Writers, 3rd Edition by Christopher Vogler (2007; via Chanan Berkovits). You may have heard of Joseph Campbell's The Hero with a Thousand Faces, but how about something with more contemporary references? Also, does the obligatory meta thing and shows how the process of writing itself follows the mythic structure.
π On the Consumption of AI-Generated Content at Scale (Shreya Shankar). Thoughtful take.
TIL: importlib.metadata.version #
Apparently __version__ can be dynamic now.
While I was updating my standard pyproject.toml to use dependency groups, I switched to using uv as my build backend (from setuptools). Like all the other design choices, it has very sensible defaults with good overrides when you need them.
One thing that it doesn't support is dynamic versions (i.e. reading __version__ from __init__.py). Charlie Marsh explains:
Using dynamic metadata for things that are actually just static lookups feels like the wrong tradeoff.
Like
version = ["dynamic"]to read the version from__init__.py.As soon as you have dynamic metadata, you need to install dependencies and run Python just to get that info.
Static metadata rules. Just write the version out twice!
This makes sense, but I really didn't want to write out the version twice. Luckily, uv has a nice uv version command to change/bump the version number in the pyproject.toml, so I started thinking about how I'd also change the version in the __init__.py at the same time.
I asked ChatGPT what the best approach was and it suggested something quite different: don't write the value in __init__.py at all.
from importlib.metadata import version, PackageNotFoundError
try:
__version__ = version("package-name") # from pyproject.toml: project.name
except PackageNotFoundError:
__version__ = "0.0.0" # aka unknown version
I have since noticed that this was also the suggestion Adam Johnson had in the same thread.
One minor concern I have is whether this works in a cosmofy build, but that will be a separate exploration.
Dependency Groups to the Rescue #
Finally a standard place to put dev dependencies.
Previously: Stop Hiding Python Dev Dependencies
I'm a bit late to the party, but even when I saw that PEP 735 β Dependency Groups in pyproject.toml had been accepted and standardized by PyPA, it still didn't register how this should impact my pyproject.toml configurations.
In my previous post, I argued that absent a standard place to put dev dependencies in pyproject.toml, we should opt to use optional-dependencies. However, dependency groups seem to offer a nice standard place for such dependencies: these are bundles of dependencies that don't get built into the final distribution (i.e. they are not required to run the package).
Feels like the best of both worlds and uv already started using dependency-groups.dev as the place that uv add --dev writes to and this group is sync'd by default when using uv sync and uv run.
I only really got this when I read Simon Willison's post about how he's using dependency groups to make it easier for people to hack on his code.
π Remix: Making Art and Commerce Thrive in the Hybrid Economy by Lawrence Lessig (2002; via Tribe of Mentors & Joseph Gordon Levitt). I knew most of these ideas from having read TechDirt for so many years and listening to Lessig talk about these ideas for several decades. Still, I was surprised how much of the fights we have today still stem from a basic disagreement about copyright and how art gets made.
π Topgrading: The Proven Hiring and Promoting Method that Turbocharges Company Performance, Third Edition by Bradford D. Smart (2012; via Tim Ferriss). More than 20 years later, many parts of this still make sense even though core parts would require rethinking in an LLM world.
π Dare To Author!: Take Charge of the Narrative of Your Life by Lior Arussy (2024; via Elizabeth Kratz). A nice structured approach to updating how you think about your life story.
π Donβt Build an Audience (Human Invariant). It's the bell curve meme: create cool stuff - I need to build an audience - create cool stuff.
π Closed: Bad error messages from blog post (Facebook). Turns out pyrefly developers saw my previous post, broke things down into many sub-issues and fixed them all. pyrefly now reports zero errors in castfit and the errors it find in other repos have pretty understandable error messages!
π Disrupting the first reported AI-orchestrated cyber espionage campaign (Anthropic). Expect more of this in the future.
castfit 0.1.3 #
Now with a non-exhaustive is_subtype function
castfit 0.1.3 is available. The biggest thing I did was implement is_subtype which is a forced me to learn about invariant, covariant, and contravariant types.
To install castfit:
# modern (recommended)
uv add castfit
# classic
python -m pip install castfit
Release Notes 0.1.3 - 2025-11-27T03:12:11Z #
Changed
- #33 PyPI publishing to support newer
uv buildmetadata - #40 PyPI publishing to use
uv publishinstead ofpypa/gh-action-pypi-publish
Added
- #23 ability to type check
Callableviais_subtype - #34 support for
propertyfields on classes - #35
__name__toTypeInfoif present - #36 support for default values in
dataclasses.Field - #37 support for function definitions in classes
Removed
- #40 support for python 3.9
Security
- #40 We are trying out
uv publishinstead ofpypa/gh-action-pypi-publish.
π Power: Why Some People Have Itβand Others Don't by Jeffrey Pfeffer (2010; via Robin Hanson). A blend of anecdotes and social science experiments that didn't replicate. The networking bits seemed fine. Everything else was kinda meh.
π Remote: Office Not Required by Jason Fried & David Heinemeier Hansson (2013; via Iridescent Learning). It's interesting to see how work from home policies have ebbed and flowed since 2013.
π Why 98.5% of organizations have slow actions/checkout (Chris Goller / depot; via Changelog News). I'm hesitant to fiddle with the git internals, but the sparse checkout and partial clone sound like easy things to try. (Most of GitHub Actions were sped up by using uv.)
π Deploying to Amazon's cloud is a pain in the AWS younger devs won't tolerate (Corey Quinn / The Register; via Changelog News). Hilarious take, but so true. It took me 7 years to be able to close a handful of student accounts (who had inactive emails after graduation) that were still charging my billing account, but whose EC2 instances were not visible to me because of AWS permissions issues.
π Game design is simple, actually (Raph Koster). Clickbait title aside, there are twelve compact and useful design lessons each of which is a whole world unto itself.
π The Algorithmic Turn: The Emerging Evidence On AI Tutoring That's Hard to Ignore (Carl Hendrick / The Learning Dispatch). Long post covers many questions about the material properties of learning and teaching. Also covers both the disappointment of various EdTech approaches and the possibility of surpassing them.
π Making XML human-readable without XSLT (Jake Archibald; via Simon Willison). I have always found XSLT to be both impressive and horrifying. Makes sense that it's a security nightmare for browsers.
π The Case Against pgvector (Alex Jacobs; via Simon Willison). I actually got questions about picking an index for pgvector; the options aren't great and this article explains why.
π Claude Agent Skills: A First Principles Deep Dive (Han Lee). Very long, but informative break down of how Claude's Agent Skills works and how its different from function calling. I was particularly impressed by how the UI has to adapt between information being fed back to the LLM and information for the user.
π SQLite concurrency and why you should care about it (Jean-Pierre Bachmann / Jellyfin). In all the times I've gotten a SQLite locking issue, the solution has always been to retry a few times (until some other process releases the lock). But this article suggests a few other ways to solve the problem.
π The Wise Man's Fear by Patrick Rothfuss (2011; via Shalev NessAiver). Sequel to The Name of the Wind. Patrick Rothfuss joins the ranks of several other fantasy authors in having an unfinished series. I ended up reading the rants of his fans and editors as well as counter points that authors don't owe readers books. This book was a fine sequel; not as great and a bit graphic at times.
π The Name of the Wind by Patrick Rothfuss (2007; via Shalev NessAiver). It's got stories-within-stories, sympathetic magic-as-physics, and a prodigy for a main character. What more could you want?
π The 4-Hour Workweek: Escape 9β5, Live Anywhere, and Join the New Rich by Tim Ferriss (2009). Took me 16 years to finally read the book that bootstrapped Tim's takeoff. Turns out all of his books are in the same action-packed-encyclopedia style.
π Side project advice (Ned Batchelder). This reads like short & simple advice, but it is clearly hard-won and I should re-read this several times a year.
π Three tough truths about climate (Bill Gates). One of the more grounded perspectives on cost-benefit analysis as applied to climate change.
π AI isn't replacing radiologists (Deena Mousa / Works in Progress; via Benj Azose). How long do we think the islands of automation will last?
π You already have a git server (maurycyz; via Changelog News). I'm so tempted to do this, but it feels wrong.
π Battling Infectious Diseases in the 20th Century: The Impact of Vaccines (Tynan DeBold & Dov Friedman / WSJ). Some of my favorite graphics depicting the impact of vaccines on mortality after being introduced. These are about a decade old and, unfortunately, vaccine hesitancy / avoidance is going to make mortality go up again.
π Will AI displace humans in the economy and culture? (Andrew Mayne). A thoughtful take, although I don't know how to rate the predictions.