Technology

Dependency Management for Small SaaS Teams: A Simple Update Routine

Neglected packages turn into emergencies. Here is the boring weekly routine I use to keep NuGet and npm dependencies current without derailing feature work.

Dependency Management for Small SaaS Teams: A Simple Update Routine

Dependency management for small SaaS teams is one of those jobs nobody wants and everybody pays for eventually. You ship the product, the packages sit there quietly for eighteen months, and then a security advisory lands on a Friday afternoon and you discover you are four major versions behind on something critical.

I have been through this on every product I have built, including CampSuite. The teams that cope well are not the ones with the cleverest tooling. They are the ones who treat updates as a boring weekly habit rather than an occasional emergency.

Why neglected NuGet packages come back to bite you

Every package you reference is code you did not write and probably have not read. That is fine, it is the whole point of using them. But it also means your risk profile changes every time someone publishes a vulnerability, abandons a repository or ships a breaking release.

The painful bit is that updates compound. Moving one minor version is a ten minute job. Moving across three major versions means reading three sets of release notes, fixing breaking changes in several places and hoping your tests are good enough to tell you what you broke.

I once inherited a project where the main web framework was so far behind that the upgrade needed its own funded project. Nobody had done anything wrong on any single day. They had just ignored the problem a little bit, every week, for years.

A simple dependency update routine that actually works

You do not need a process document with flowcharts. You need a small, repeatable routine that fits around real work. Here is what I recommend for a team of one to five developers.

Automate the pull requests

Turn on Dependabot or Renovate and let it open pull requests for you. Both are free for most small teams and both work well with .NET, npm and Docker images. The point is that the update arrives as a small, reviewable change instead of a vague item on a to do list that never gets done.

Group the noisy ones. Patch updates for the same ecosystem can go into a single weekly pull request, which keeps your list manageable and stops the bot becoming something your team learns to ignore.

Set a fixed weekly slot

Pick one slot a week, maybe an hour on a Tuesday morning, and use it to merge whatever the bot has raised. If the build is green and the change is a patch or minor release, merge it. If it is a major version, read the release notes and decide whether it goes in this week or gets its own ticket.

The fixed slot matters more than the exact day. When updates have a home in the calendar, they stop competing with feature work and losing every time.

Let your tests do the arguing

Automated updates are only safe if your test suite can catch a bad one. You do not need perfect coverage, but you do need tests around the parts of the app that make you money, such as sign up, billing and your main workflow. If your tests are thin, update dependencies in small batches so you can see which one broke things.

This is also where a decent CI/CD pipeline earns its keep. If every pull request builds, tests and deploys to a staging slot automatically, merging a dependency bump becomes a low drama event.

Which packages deserve extra attention

Not every dependency is equal. A logging helper that is a version behind is annoying. An authentication library that is a version behind is a genuine risk.

I keep a rough mental list of the packages that sit on the critical path: authentication, anything that handles payments, serialisation, the web framework itself and your database driver. Those get updated promptly, usually within days of a security release. Everything else follows the weekly routine.

It is also worth checking how healthy a package is before you add it. When was the last release? How many open issues are being ignored? Is it maintained by one person who has not committed in two years? Picking a boring, well supported library over a shiny one saves you a migration later, which echoes what I wrote about build versus buy decisions.

Handling security advisories without panicking

Run dotnet list package --vulnerable in your pipeline, or use the equivalent audit command for npm. Fail the build on high severity findings and you will hear about problems the day they appear rather than six months later in a customer security questionnaire.

When an advisory does land, work through it calmly. Is the vulnerable code path actually reachable in your app? Is there a patched version? Can you update it today, or do you need a temporary mitigation? Most of the time the answer is a quick update and a deploy, and the routine you already have makes that easy.

Know when to stop updating

Being current is a good default but it is not a religion. Some libraries release breaking changes every few months for no obvious benefit to you, and chasing every one is a waste of time. If a package is stable, secure and doing its job, a version or two behind is usually fine.

Where I draw the line is anything that has gone out of support. Running an end of life runtime or framework is a choice to accept risk that nobody is fixing for you. Put the support dates in your calendar and plan the move well before they arrive.

Make it part of how you work

The real fix for dependency headaches is cultural, not technical. Small, regular updates feel like nothing. Big, rare ones feel like a crisis, and they usually arrive at the worst possible moment.

If you want a hand setting up a sensible update process, or untangling a codebase that has fallen years behind, that is exactly the sort of problem I help with through my software development services. And if you are building something from scratch, The 28 Day Startup covers how to keep a young product healthy from day one.

More from the blog

Technology•6 min read

Secrets Management for Small SaaS Teams: A Practical Guide

Read more
Technology•7 min read

Technical Debt Is Not the Enemy: A Practical Guide for Small Teams

Read more
Business•8 min read

Five Things I Learned Bootstrapping Five Businesses

Read more