The Package That Would Not Leave
There is a particular kind of quiet that happens around an old dependency.
Not dramatic quiet. No siren from monitoring, no customer email with a subject line that has learned to shout. Just a small pause in the room when someone says, “Can we remove this yet?” and everyone looks at the package name like it might answer for itself.
It usually cannot.
The name is often boring. A library with a hyphen in the middle. A helper tool that once mattered very much to one installer path, one maintenance script, one machine model with a temperament. It sits in the distro because, at some point, removing it was more expensive than leaving it alone.
This is one of the less glamorous truths about running your own Linux distribution: the hard part is not adding software. Adding software is almost festive by comparison. You find the thing, inspect the thing, build the thing, package the thing, sign it, test it, ship it. There are enough steps to feel serious, and enough visible progress to make the work look like work.
Removal is stranger.
Removal asks whether you understand the shape of your own system well enough to make it smaller.
That sounds simple until the system includes old installs, fresh installs, machines in the office, machines in a rack, machines that only boot when someone remembers the right cable, machines that have been upgraded through enough eras to qualify as oral history. A package can be unused in the obvious place and still be carrying a small bridge somewhere else.
Software likes to pretend it is made of declarations. This depends on that. This conflicts with that. This version replaces that one.
A real system is also made of habits.
Someone wrote a recovery note that assumes a command exists. Someone made a script that never entered the repository because it was only supposed to be temporary. Someone remembers that one GPU behaved better when a tool was present, though the reason is now wrapped in fog. Someone else says, correctly, that memory is not a dependency graph.
Both are right, which is how the meeting gets annoying.
I have come to respect the annoyance.
A small software company accumulates weight differently from a large one. There is less bureaucracy, but there is also less ceremony around memory. Decisions get made in chat, in commits, in the space between lunch and the next build. The good part is speed. The bad part is that speed does not always leave a clean receipt.
A package that will not leave is often not a technical problem yet. It is an accounting problem. Not money accounting, though eventually it becomes that too. It is an accounting of promises.
What did we promise the installer would do?
What did we promise existing machines would survive?
What did we promise future maintainers would not have to rediscover?
The answer is rarely “keep everything forever.” That way lies the dusty shelf where every workaround becomes infrastructure and every fear gets root access.
But the answer is also not “delete boldly.” That phrase looks good on a sticker and bad in a boot log.
The honest work lives between them.
You trace the package. You ask what calls it. You ask what only calls it when something has already gone wrong. You look for scripts with names that sound temporary and are old enough to rent a car. You check the build path, the install path, the recovery path. You separate “needed” from “familiar,” which is harder than it should be.
Then, if the evidence holds, you remove it in the least romantic way possible.
A small change. A test image. A note that explains why the absence is intentional. Maybe a compatibility shim if the old name is part of someone’s muscle memory. Maybe a staged removal because confidence should have manners.
The beautiful thing about this work is also the irritating thing: if it goes well, almost nothing happens.
The system boots.
The install completes.
The logs do not acquire a new personality.
Nobody notices the package is gone.
That is a hard result to celebrate. It has no launch shape. It does not make a good screenshot. It is maintenance with the volume turned down.
But it changes the room.
Every removed dependency makes the next question slightly easier to answer. Every documented absence gives the future a little less guessing to do. The distro gets smaller in a way that is not only measured on disk. It gets less haunted.
I think this is why I keep noticing these moments. Not because a package removal is profound by itself. Most of them are aggressively ordinary. The point is what the decision requires from the team: proof instead of vibes, memory turned into text, caution without paralysis.
That is a decent standard for more than packaging.
Software work is full of things that remain because no one wants to be the person who breaks the old path. Sometimes that caution is wisdom. Sometimes it is just fear wearing a sysadmin jacket.
The trick is learning to tell the difference before the old path becomes the road.