Maintaining Open Source in the AI Era
Hi there, little explorer! Imagine you have some special toy sets, like LEGOs, that you built and shared with your friends.
This story is about a grown-up who made some computer "toy sets" called programs. He shared them for free, like sharing your LEGOs! This is called open source.
Sometimes, these old toy sets get a bit dusty or broken, like an old robot that needs new batteries. So, he has to fix them up to make them shiny and work with new toys.
Guess what? He sometimes gets help from a smart computer helper (like a robot friend!) to fix these old toy sets. It's like magic!
He also talks about how sharing these toy sets is a bit different now, like some toy boxes are easier to open than others. But the main idea is: he keeps his computer toys working so everyone can play! Isn't that neat?
<p>I've been maintaining a handful of open source packages lately: <a href="https://pypi.org/project/mailview/" rel="noopener noreferrer">mailview</a>, <a href="https://pypi.org/project/mailjunky/" rel="noopener noreferrer">mailjunky</a> (in both Python and Ruby), and recently dusted off an old Ruby gem called <a href="https://rubygems.org/gems/tvdb_api/" rel="noopener noreferrer">tvdb_api</a>. The experience has been illuminating - not just about package management, but about how AI is changing open source development in ways I'm still processing.</p> <h2> The Packages </h2> <p><strong>mailview</strong> started because I missed <a href="https://github.com/ryanb/letter_opener" rel="noopener noreferrer">letter_opener</a> from the Ruby world. When you're developing a web application, you don
I've been maintaining a handful of open source packages lately: mailview, mailjunky (in both Python and Ruby), and recently dusted off an old Ruby gem called tvdb_api. The experience has been illuminating - not just about package management, but about how AI is changing open source development in ways I'm still processing.
The Packages
mailview started because I missed letter_opener from the Ruby world. When you're developing a web application, you don't want emails actually being sent - you want to inspect them locally. In Rails, letter_opener handles this beautifully. In Python? The options were less elegant. So I built mailview: add the middleware to your FastAPI or ASGI app, and every outgoing email gets captured and displayed in a clean browser UI at /mail.
mailjunky is the SDK for a transactional email service I use. I wrote both Python and Ruby versions because I work across both ecosystems and wanted a consistent interface. The Python version powers the email notifications in whatisonthe.tv, sending watchlist digests and update notifications.
tvdb_api is older. I wrote it years ago when I needed to fetch TV show metadata from TheTVDB. Recently I came back to it and found... well, it had aged poorly.
When Code Goes Stale
Opening tvdb_api after several years was humbling. The code still worked, technically, but it was written for a different era of Ruby. No keyword arguments where they'd make sense. Inconsistent error handling. Dependencies that had moved on. The API it wrapped had evolved through multiple versions.
This is the reality of open source maintenance that doesn't get discussed enough. You release something, people use it, and then life happens. You move to different projects. The ecosystem evolves. What was idiomatic becomes dated.
I spent a weekend modernising tvdb_api. Keyword arguments throughout. Proper exception hierarchies. Updated API support. Modern testing practices. The gem that emerged was recognisably the same tool but felt contemporary rather than archaeological.
The irony isn't lost on me that I did this modernisation with Claude's help. More on that shortly.
Ruby vs Python: A Tale of Two Package Managers
Here's where things get interesting. Publishing to RubyGems versus PyPI in 2026 is a study in contrasts.
RubyGems feels... creaky. The authentication flow is clunky. The web interface looks dated. I've hit mysterious failures that resolved themselves without explanation. The documentation assumes knowledge that new maintainers might not have. It works, but it feels like infrastructure that's been maintained rather than evolved.
PyPI, meanwhile, has embraced Trusted Publishing. You configure your GitHub repository as a trusted publisher, and your GitHub Actions workflow can publish packages without storing API tokens as secrets. The authentication happens via OpenID Connect - GitHub attests to the identity of the workflow, PyPI trusts that attestation.
The practical difference is significant:
# PyPI with Trusted Publishing - no secrets needed
- name: Publish to PyPI uses: pypa/gh-action-pypi-publish@release/v1`
Enter fullscreen mode
Exit fullscreen mode
Compare this to RubyGems, where you're still managing API keys, storing them as secrets, and hoping you've configured the authentication correctly.
For mailview and mailjunky-python, I set up Trusted Publishing and the release process is now: tag a release, push the tag, and GitHub Actions handles the rest. For the Ruby packages, there's more ceremony involved, and I've had releases fail for reasons that weren't immediately clear.
I don't want to overstate this - RubyGems works and millions of packages depend on it. But PyPI's investment in modern authentication patterns has made the maintainer experience noticeably better.
AI Changed Everything (And I'm Not Sure How I Feel About It)
Here's where I need to be honest about something uncomfortable.
All of these packages were built with significant AI assistance. Claude helped write the initial implementations. It helped with test coverage. It modernised tvdb_api's Ruby patterns. It debugged edge cases I would have spent hours tracking down.
The productivity gains are real. What might have taken weeks of evening and weekend work happened in days. Features that I might have cut for time made it in. Test coverage that I might have skipped got written.
But.
I look at open source differently now, and I'm not sure it's for the better.
When I review pull requests on other projects, I find myself wondering: did a human think through this change, or did an AI generate it and a human click approve? When I encounter a bug in a library, I wonder: was this edge case missed because the AI-generated tests didn't think to cover it?
The social contract of open source has always been implicit: someone cared enough about this problem to spend their limited time solving it. That investment of human attention was a signal of quality, of thoughtfulness. It's why we trusted small libraries maintained by individuals - someone was paying attention.
AI disrupts this calculus. I can now create a package in an afternoon that would have taken weeks. But has the thoughtfulness kept pace with the speed? I've tried to maintain the same standards I would have without AI assistance, but I'm not certain I've succeeded. And I definitely can't evaluate whether other maintainers have.
The Testing Paradox
This concern crystallises around testing. AI is excellent at generating tests. Given a function, Claude will produce comprehensive test cases covering happy paths, edge cases, error conditions. The coverage numbers look great.
But test generation isn't the same as test thinking. When I write tests manually, I'm forced to think about how the code will be used. What assumptions am I making? What could go wrong? What would a user reasonably expect?
AI-generated tests cover the code that exists. Human-written tests often reveal the code that should exist. There's a subtle but important difference.
I've tried to mitigate this by reviewing AI-generated tests carefully and adding cases that emerge from my understanding of how the package will be used in practice. But I'd be lying if I said every test got that level of attention.
What I've Learned
A few things have become clearer through this experience:
Maintenance is the hard part. Writing the initial code is the easy bit. Keeping it current, fixing bugs, responding to issues, updating dependencies - that's where open source lives or dies. AI helps with maintenance too, but it doesn't solve the fundamental problem of limited human attention.
Modern tooling matters. PyPI's Trusted Publishing removed a category of release friction entirely. When releasing is easy, releases happen more often. When it's painful, packages go stale. This is boring infrastructure work, but it has real effects on ecosystem health.
AI is a force multiplier, not a replacement. The packages I'm happiest with are ones where I used AI to handle the mechanical work while staying engaged with the design decisions. The ones where I let AI drive too much feel... hollow, somehow. Technically correct but lacking in soul.
Transparency matters. I've started noting in my projects when AI was used significantly in development. Not as a warning, but as context. Users can decide for themselves what that means.
Where This Leaves Me
I'm going to keep maintaining these packages. People use them, and I use them myself. The experience has made me more thoughtful about what I'm building and why.
But I watch the open source ecosystem with more concern than I used to. The barriers to creating packages have dropped dramatically. That's good for getting solutions out there quickly. I'm less sure it's good for the long-term health of software we all depend on.
Maybe I'm worrying about nothing. Maybe AI-assisted development will become so normal that these concerns seem quaint. Maybe the tooling will evolve to help us distinguish thoughtful work from generated slop.
For now, I'm trying to hold myself to the standards I had before AI assistance was available, while being honest that the assistance exists. It's an imperfect balance, but it's the best I've found.
The packages are on PyPI and RubyGems if you want to use them. They work. I've tested them. Claude helped.
Make of that what you will.
Sign in to highlight and annotate this article

Conversation starters
Daily AI Digest
Get the top 5 AI stories delivered to your inbox every morning.
More about
claudereleaseavailable
Running OpenClaw with Gemma 4 TurboQuant on MacAir 16GB
Hi guys, We’ve implemented a one-click app for OpenClaw with Local Models built in. It includes TurboQuant caching, a large context window, and proper tool calling. It runs on mid-range devices. Free and Open source. The biggest challenge was enabling a local agentic model to run on average hardware like a Mac Mini or MacBook Air. Small models work well on these devices, but agents require more sophisticated models like QWEN or GLM. OpenClaw adds a large context to each request, which caused the MacBook Air to struggle with processing. This became possible with TurboQuant cache compression, even on 16gb memory. We found llama.cpp TurboQuant implementation by Tom Turney. However, it didn’t work properly with agentic tool calling in many cases with QWEN, so we had to patch it. Even then, the

AI As Co- Collaberator
I’ve long been thinking on the idea of AIs as co-collaborators on projects. My line of reasoning typically involves theoretical arguments and such, where you present an idea and you present it in such a way that the AI is encouraged to contemplate the idea alongside you.This is akin to being a senior researcher and inviting other researchers to work alongside you. Sometimes you just need more hands in a lab but sometimes you want more minds picking away at the idea. And so in this endeavor I have worked on the idea of how to conceptualize AI as a co-collaborator not just as an information deliverer or a giant calculator. Now some of this is in general just in the AI’s general ability to be generative on certain topics. AI, as large language models, work by breaking down conversations into
Knowledge Map
Connected Articles — Knowledge Graph
This article is connected to other articles through shared AI topics and tags.
More in Releases

📙 Journal Log no. 1 Linux Unhatched ; My DevSecOps Journey
I graduated with a B.Eng in Mechanical Engineering in 2018, but my career path has always been driven by the logic of systems. After earning my Google IT Automation with Python Professional Certificate, I realized that the most powerful engines today are built in the cloud. I am now officially on my journey toward DevSecOps. This log marks the first step to my goal. 📙 Journal Log: 2026-04-05 🎯 Today's Mission Mastering the Fundamentals: Bridging the gap between physical systems thinking and terminal based automation 🛠️ Environment Setup Machine/OS: NDG Virtual Machine (Ubuntu-based) Current Directory: ~/home/sysadmin ⌨️ Commands Flags Learned Command Flag/Context What it does ls -l Lists files in long format (essential for checking permissions). chmod +x Changes file access levels—the D

Harmonic-9B - Two-stage Qwen3.5-9B fine-tune (Stage 2 still training)
Hey r/LocalLLaMA , I just uploaded Harmonic-9B, my latest Qwen3.5-9B fine-tune aimed at agent use. Current status: • Stage 1 (heavy reasoning training) is complete • Stage 2 (light tool-calling / agent fine-tune) is still training right now The plan is to combine strong structured reasoning with clean, reliable tool use while trying to avoid making normal chat feel stiff or overly verbose. Filtered dataset for Stage 2: I open-sourced the filtered version of the Hermes agent traces I’m using for the second stage: https://huggingface.co/datasets/DJLougen/hermes-agent-traces-filtered Key improvements after filtering: • Self-correction: 6% → 63% • Verification steps: 26% → 96% • Thinking depth: +40% • Valid JSON/tool calls: 100% GGUF quants are already available here: https://huggingface.co/DJ

How to Clean Up Xcode and Free 30-50GB on Your Mac
Xcode is the single biggest storage consumer on most developers' Macs. A fresh install starts around 35GB, but over months of development it quietly grows to 80, 100, even 150GB+. Most of that growth is invisible — cached build products, old simulators, debug symbols for iOS versions you no longer use. I've been building iOS apps for years, and this problem is exactly why I built MegaCleaner — I got tired of manually tracking down these hidden folders every few months. But whether you use a tool or do it by hand, you should know where the space goes. This guide covers every Xcode storage category: what it is, where it lives, how big it typically gets, and whether it's safe to delete. No guesswork, no vague advice — just exact paths and clear safety levels. Quick Reference Before we dive in




Discussion
Sign in to join the discussion
No comments yet — be the first to share your thoughts!